110
110
* Maximal length of one node
111
111
* ----------
112
112
*/
113
- #define DCH_MAX_ITEM_SIZ 9 /* maxjulian day*/
113
+ #define DCH_MAX_ITEM_SIZ 12 /* maxlocalized day name */
114
114
#define NUM_MAX_ITEM_SIZ 8/* roman number (RN has 15 chars)*/
115
115
116
116
/* ----------
@@ -525,10 +525,12 @@ do { \
525
525
* Suffixes definition for DATE-TIME TO/FROM CHAR
526
526
* ----------
527
527
*/
528
+ #define TM_SUFFIX_LEN 2
529
+
528
530
static KeySuffix DCH_suff []= {
529
531
{"FM" ,2 ,DCH_S_FM ,SUFFTYPE_PREFIX },
530
532
{"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 },
532
534
{"tm" ,2 ,DCH_S_TM ,SUFFTYPE_PREFIX },
533
535
{"TH" ,2 ,DCH_S_TH ,SUFFTYPE_POSTFIX },
534
536
{"th" ,2 ,DCH_S_th ,SUFFTYPE_POSTFIX },
@@ -537,6 +539,7 @@ static KeySuffix DCH_suff[] = {
537
539
{NULL ,0 ,0 ,0 }
538
540
};
539
541
542
+
540
543
/* ----------
541
544
* Format-pictures (KeyWord).
542
545
*
@@ -2495,7 +2498,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2495
2498
if (!tm -> tm_mon )
2496
2499
break ;
2497
2500
if (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
+ }
2499
2511
else
2500
2512
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2501
2513
asc_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
2506
2518
if (!tm -> tm_mon )
2507
2519
break ;
2508
2520
if (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
+ }
2510
2531
else
2511
2532
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2512
2533
months_full [tm -> tm_mon - 1 ]);
@@ -2517,7 +2538,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2517
2538
if (!tm -> tm_mon )
2518
2539
break ;
2519
2540
if (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
+ }
2521
2551
else
2522
2552
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2523
2553
asc_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
2528
2558
if (!tm -> tm_mon )
2529
2559
break ;
2530
2560
if (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
+ }
2532
2571
else
2533
2572
strcpy (s ,asc_toupper_z (months [tm -> tm_mon - 1 ]));
2534
2573
s += strlen (s );
@@ -2538,7 +2577,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2538
2577
if (!tm -> tm_mon )
2539
2578
break ;
2540
2579
if (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
+ }
2542
2590
else
2543
2591
strcpy (s ,months [tm -> tm_mon - 1 ]);
2544
2592
s += strlen (s );
@@ -2548,7 +2596,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2548
2596
if (!tm -> tm_mon )
2549
2597
break ;
2550
2598
if (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
+ }
2552
2609
else
2553
2610
strcpy (s ,asc_tolower_z (months [tm -> tm_mon - 1 ]));
2554
2611
s += strlen (s );
@@ -2562,7 +2619,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2562
2619
case DCH_DAY :
2563
2620
INVALID_FOR_INTERVAL ;
2564
2621
if (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
+ }
2566
2632
else
2567
2633
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2568
2634
asc_toupper_z (days [tm -> tm_wday ]));
@@ -2571,7 +2637,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2571
2637
case DCH_Day :
2572
2638
INVALID_FOR_INTERVAL ;
2573
2639
if (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
+ }
2575
2650
else
2576
2651
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2577
2652
days [tm -> tm_wday ]);
@@ -2580,7 +2655,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2580
2655
case DCH_day :
2581
2656
INVALID_FOR_INTERVAL ;
2582
2657
if (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
+ }
2584
2668
else
2585
2669
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2586
2670
asc_tolower_z (days [tm -> tm_wday ]));
@@ -2589,23 +2673,50 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
2589
2673
case DCH_DY :
2590
2674
INVALID_FOR_INTERVAL ;
2591
2675
if (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
+ }
2593
2686
else
2594
2687
strcpy (s ,asc_toupper_z (days_short [tm -> tm_wday ]));
2595
2688
s += strlen (s );
2596
2689
break ;
2597
2690
case DCH_Dy :
2598
2691
INVALID_FOR_INTERVAL ;
2599
2692
if (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
+ }
2601
2703
else
2602
2704
strcpy (s ,days_short [tm -> tm_wday ]);
2603
2705
s += strlen (s );
2604
2706
break ;
2605
2707
case DCH_dy :
2606
2708
INVALID_FOR_INTERVAL ;
2607
2709
if (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
+ }
2609
2720
else
2610
2721
strcpy (s ,asc_tolower_z (days_short [tm -> tm_wday ]));
2611
2722
s += strlen (s );