110110 * Maximal length of one node
111111 * ----------
112112 */
113- #define DCH_MAX_ITEM_SIZ 9 /* maxjulian day*/
113+ #define DCH_MAX_ITEM_SIZ 12 /* maxlocalized day name */
114114#define NUM_MAX_ITEM_SIZ 8/* roman number (RN has 15 chars)*/
115115
116116/* ----------
@@ -525,10 +525,12 @@ do { \
525525 * Suffixes definition for DATE-TIME TO/FROM CHAR
526526 * ----------
527527 */
528+ #define TM_SUFFIX_LEN 2
529+
528530static KeySuffix DCH_suff []= {
529531{"FM" ,2 ,DCH_S_FM ,SUFFTYPE_PREFIX },
530532{"fm" ,2 ,DCH_S_FM ,SUFFTYPE_PREFIX },
531- {"TM" ,2 ,DCH_S_TM ,SUFFTYPE_PREFIX },
533+ {"TM" ,TM_SUFFIX_LEN ,DCH_S_TM ,SUFFTYPE_PREFIX },
532534{"tm" ,2 ,DCH_S_TM ,SUFFTYPE_PREFIX },
533535{"TH" ,2 ,DCH_S_TH ,SUFFTYPE_POSTFIX },
534536{"th" ,2 ,DCH_S_th ,SUFFTYPE_POSTFIX },
@@ -537,6 +539,7 @@ static KeySuffix DCH_suff[] = {
537539{NULL ,0 ,0 ,0 }
538540};
539541
542+
540543/* ----------
541544 * Format-pictures (KeyWord).
542545 *
@@ -2495,7 +2498,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
24952498if (!tm -> tm_mon )
24962499break ;
24972500if (S_TM (n -> suffix ))
2498- strcpy (s ,str_toupper_z (localized_full_months [tm -> tm_mon - 1 ],collid ));
2501+ {
2502+ char * str = str_toupper_z (localized_full_months [tm -> tm_mon - 1 ],collid );
2503+
2504+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2505+ strcpy (s ,str );
2506+ else
2507+ ereport (ERROR ,
2508+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2509+ errmsg ("localized string format value too long" )));
2510+ }
24992511else
25002512sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
25012513asc_toupper_z (months_full [tm -> tm_mon - 1 ]));
@@ -2506,7 +2518,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25062518if (!tm -> tm_mon )
25072519break ;
25082520if (S_TM (n -> suffix ))
2509- strcpy (s ,str_initcap_z (localized_full_months [tm -> tm_mon - 1 ],collid ));
2521+ {
2522+ char * str = str_initcap_z (localized_full_months [tm -> tm_mon - 1 ],collid );
2523+
2524+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2525+ strcpy (s ,str );
2526+ else
2527+ ereport (ERROR ,
2528+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2529+ errmsg ("localized string format value too long" )));
2530+ }
25102531else
25112532sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
25122533months_full [tm -> tm_mon - 1 ]);
@@ -2517,7 +2538,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25172538if (!tm -> tm_mon )
25182539break ;
25192540if (S_TM (n -> suffix ))
2520- strcpy (s ,str_tolower_z (localized_full_months [tm -> tm_mon - 1 ],collid ));
2541+ {
2542+ char * str = str_tolower_z (localized_full_months [tm -> tm_mon - 1 ],collid );
2543+
2544+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2545+ strcpy (s ,str );
2546+ else
2547+ ereport (ERROR ,
2548+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2549+ errmsg ("localized string format value too long" )));
2550+ }
25212551else
25222552sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
25232553asc_tolower_z (months_full [tm -> tm_mon - 1 ]));
@@ -2528,7 +2558,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25282558if (!tm -> tm_mon )
25292559break ;
25302560if (S_TM (n -> suffix ))
2531- strcpy (s ,str_toupper_z (localized_abbrev_months [tm -> tm_mon - 1 ],collid ));
2561+ {
2562+ char * str = str_toupper_z (localized_abbrev_months [tm -> tm_mon - 1 ],collid );
2563+
2564+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2565+ strcpy (s ,str );
2566+ else
2567+ ereport (ERROR ,
2568+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2569+ errmsg ("localized string format value too long" )));
2570+ }
25322571else
25332572strcpy (s ,asc_toupper_z (months [tm -> tm_mon - 1 ]));
25342573s += strlen (s );
@@ -2538,7 +2577,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25382577if (!tm -> tm_mon )
25392578break ;
25402579if (S_TM (n -> suffix ))
2541- strcpy (s ,str_initcap_z (localized_abbrev_months [tm -> tm_mon - 1 ],collid ));
2580+ {
2581+ char * str = str_initcap_z (localized_abbrev_months [tm -> tm_mon - 1 ],collid );
2582+
2583+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2584+ strcpy (s ,str );
2585+ else
2586+ ereport (ERROR ,
2587+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2588+ errmsg ("localized string format value too long" )));
2589+ }
25422590else
25432591strcpy (s ,months [tm -> tm_mon - 1 ]);
25442592s += strlen (s );
@@ -2548,7 +2596,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25482596if (!tm -> tm_mon )
25492597break ;
25502598if (S_TM (n -> suffix ))
2551- strcpy (s ,str_tolower_z (localized_abbrev_months [tm -> tm_mon - 1 ],collid ));
2599+ {
2600+ char * str = str_tolower_z (localized_abbrev_months [tm -> tm_mon - 1 ],collid );
2601+
2602+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2603+ strcpy (s ,str );
2604+ else
2605+ ereport (ERROR ,
2606+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2607+ errmsg ("localized string format value too long" )));
2608+ }
25522609else
25532610strcpy (s ,asc_tolower_z (months [tm -> tm_mon - 1 ]));
25542611s += strlen (s );
@@ -2562,7 +2619,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25622619case DCH_DAY :
25632620INVALID_FOR_INTERVAL ;
25642621if (S_TM (n -> suffix ))
2565- strcpy (s ,str_toupper_z (localized_full_days [tm -> tm_wday ],collid ));
2622+ {
2623+ char * str = str_toupper_z (localized_full_days [tm -> tm_wday ],collid );
2624+
2625+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2626+ strcpy (s ,str );
2627+ else
2628+ ereport (ERROR ,
2629+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2630+ errmsg ("localized string format value too long" )));
2631+ }
25662632else
25672633sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
25682634asc_toupper_z (days [tm -> tm_wday ]));
@@ -2571,7 +2637,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25712637case DCH_Day :
25722638INVALID_FOR_INTERVAL ;
25732639if (S_TM (n -> suffix ))
2574- strcpy (s ,str_initcap_z (localized_full_days [tm -> tm_wday ],collid ));
2640+ {
2641+ char * str = str_initcap_z (localized_full_days [tm -> tm_wday ],collid );
2642+
2643+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2644+ strcpy (s ,str );
2645+ else
2646+ ereport (ERROR ,
2647+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2648+ errmsg ("localized string format value too long" )));
2649+ }
25752650else
25762651sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
25772652days [tm -> tm_wday ]);
@@ -2580,7 +2655,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25802655case DCH_day :
25812656INVALID_FOR_INTERVAL ;
25822657if (S_TM (n -> suffix ))
2583- strcpy (s ,str_tolower_z (localized_full_days [tm -> tm_wday ],collid ));
2658+ {
2659+ char * str = str_tolower_z (localized_full_days [tm -> tm_wday ],collid );
2660+
2661+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2662+ strcpy (s ,str );
2663+ else
2664+ ereport (ERROR ,
2665+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2666+ errmsg ("localized string format value too long" )));
2667+ }
25842668else
25852669sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
25862670asc_tolower_z (days [tm -> tm_wday ]));
@@ -2589,23 +2673,50 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
25892673case DCH_DY :
25902674INVALID_FOR_INTERVAL ;
25912675if (S_TM (n -> suffix ))
2592- strcpy (s ,str_toupper_z (localized_abbrev_days [tm -> tm_wday ],collid ));
2676+ {
2677+ char * str = str_toupper_z (localized_abbrev_days [tm -> tm_wday ],collid );
2678+
2679+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2680+ strcpy (s ,str );
2681+ else
2682+ ereport (ERROR ,
2683+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2684+ errmsg ("localized string format value too long" )));
2685+ }
25932686else
25942687strcpy (s ,asc_toupper_z (days_short [tm -> tm_wday ]));
25952688s += strlen (s );
25962689break ;
25972690case DCH_Dy :
25982691INVALID_FOR_INTERVAL ;
25992692if (S_TM (n -> suffix ))
2600- strcpy (s ,str_initcap_z (localized_abbrev_days [tm -> tm_wday ],collid ));
2693+ {
2694+ char * str = str_initcap_z (localized_abbrev_days [tm -> tm_wday ],collid );
2695+
2696+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2697+ strcpy (s ,str );
2698+ else
2699+ ereport (ERROR ,
2700+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2701+ errmsg ("localized string format value too long" )));
2702+ }
26012703else
26022704strcpy (s ,days_short [tm -> tm_wday ]);
26032705s += strlen (s );
26042706break ;
26052707case DCH_dy :
26062708INVALID_FOR_INTERVAL ;
26072709if (S_TM (n -> suffix ))
2608- strcpy (s ,str_tolower_z (localized_abbrev_days [tm -> tm_wday ],collid ));
2710+ {
2711+ char * str = str_tolower_z (localized_abbrev_days [tm -> tm_wday ],collid );
2712+
2713+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2714+ strcpy (s ,str );
2715+ else
2716+ ereport (ERROR ,
2717+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2718+ errmsg ("localized string format value too long" )));
2719+ }
26092720else
26102721strcpy (s ,asc_tolower_z (days_short [tm -> tm_wday ]));
26112722s += strlen (s );