109
109
* Maximal length of one node
110
110
* ----------
111
111
*/
112
- #define DCH_MAX_ITEM_SIZ 9 /* maxjulian day*/
112
+ #define DCH_MAX_ITEM_SIZ 12 /* maxlocalized day name */
113
113
#define NUM_MAX_ITEM_SIZ 8/* roman number (RN has 15 chars)*/
114
114
115
115
/* ----------
@@ -524,10 +524,12 @@ do { \
524
524
* Suffixes definition for DATE-TIME TO/FROM CHAR
525
525
* ----------
526
526
*/
527
+ #define TM_SUFFIX_LEN 2
528
+
527
529
static KeySuffix DCH_suff []= {
528
530
{"FM" ,2 ,DCH_S_FM ,SUFFTYPE_PREFIX },
529
531
{"fm" ,2 ,DCH_S_FM ,SUFFTYPE_PREFIX },
530
- {"TM" ,2 ,DCH_S_TM ,SUFFTYPE_PREFIX },
532
+ {"TM" ,TM_SUFFIX_LEN ,DCH_S_TM ,SUFFTYPE_PREFIX },
531
533
{"tm" ,2 ,DCH_S_TM ,SUFFTYPE_PREFIX },
532
534
{"TH" ,2 ,DCH_S_TH ,SUFFTYPE_POSTFIX },
533
535
{"th" ,2 ,DCH_S_th ,SUFFTYPE_POSTFIX },
@@ -536,6 +538,7 @@ static KeySuffix DCH_suff[] = {
536
538
{NULL ,0 ,0 ,0 }
537
539
};
538
540
541
+
539
542
/* ----------
540
543
* Format-pictures (KeyWord).
541
544
*
@@ -2292,18 +2295,36 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
2292
2295
if (!tm -> tm_mon )
2293
2296
break ;
2294
2297
if (S_TM (n -> suffix ))
2295
- strcpy (s ,str_toupper_z (localized_full_months [tm -> tm_mon - 1 ]));
2298
+ {
2299
+ char * str = str_toupper_z (localized_full_months [tm -> tm_mon - 1 ]);
2300
+
2301
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2302
+ strcpy (s ,str );
2303
+ else
2304
+ ereport (ERROR ,
2305
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2306
+ errmsg ("localized string format value too long" )));
2307
+ }
2296
2308
else
2297
2309
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2298
- asc_toupper_z (months_full [tm -> tm_mon - 1 ]));
2310
+ asc_toupper_z (months_full [tm -> tm_mon - 1 ]));
2299
2311
s += strlen (s );
2300
2312
break ;
2301
2313
case DCH_Month :
2302
2314
INVALID_FOR_INTERVAL ;
2303
2315
if (!tm -> tm_mon )
2304
2316
break ;
2305
2317
if (S_TM (n -> suffix ))
2306
- strcpy (s ,str_initcap_z (localized_full_months [tm -> tm_mon - 1 ]));
2318
+ {
2319
+ char * str = str_initcap_z (localized_full_months [tm -> tm_mon - 1 ]);
2320
+
2321
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2322
+ strcpy (s ,str );
2323
+ else
2324
+ ereport (ERROR ,
2325
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2326
+ errmsg ("localized string format value too long" )));
2327
+ }
2307
2328
else
2308
2329
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2309
2330
months_full [tm -> tm_mon - 1 ]);
@@ -2314,7 +2335,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
2314
2335
if (!tm -> tm_mon )
2315
2336
break ;
2316
2337
if (S_TM (n -> suffix ))
2317
- strcpy (s ,str_tolower_z (localized_full_months [tm -> tm_mon - 1 ]));
2338
+ {
2339
+ char * str = str_tolower_z (localized_full_months [tm -> tm_mon - 1 ]);
2340
+
2341
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2342
+ strcpy (s ,str );
2343
+ else
2344
+ ereport (ERROR ,
2345
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2346
+ errmsg ("localized string format value too long" )));
2347
+ }
2318
2348
else
2319
2349
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2320
2350
asc_tolower_z (months_full [tm -> tm_mon - 1 ]));
@@ -2325,7 +2355,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
2325
2355
if (!tm -> tm_mon )
2326
2356
break ;
2327
2357
if (S_TM (n -> suffix ))
2328
- strcpy (s ,str_toupper_z (localized_abbrev_months [tm -> tm_mon - 1 ]));
2358
+ {
2359
+ char * str = str_toupper_z (localized_abbrev_months [tm -> tm_mon - 1 ]);
2360
+
2361
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2362
+ strcpy (s ,str );
2363
+ else
2364
+ ereport (ERROR ,
2365
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2366
+ errmsg ("localized string format value too long" )));
2367
+ }
2329
2368
else
2330
2369
strcpy (s ,asc_toupper_z (months [tm -> tm_mon - 1 ]));
2331
2370
s += strlen (s );
@@ -2335,7 +2374,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
2335
2374
if (!tm -> tm_mon )
2336
2375
break ;
2337
2376
if (S_TM (n -> suffix ))
2338
- strcpy (s ,str_initcap_z (localized_abbrev_months [tm -> tm_mon - 1 ]));
2377
+ {
2378
+ char * str = str_initcap_z (localized_abbrev_months [tm -> tm_mon - 1 ]);
2379
+
2380
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2381
+ strcpy (s ,str );
2382
+ else
2383
+ ereport (ERROR ,
2384
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2385
+ errmsg ("localized string format value too long" )));
2386
+ }
2339
2387
else
2340
2388
strcpy (s ,months [tm -> tm_mon - 1 ]);
2341
2389
s += strlen (s );
@@ -2345,7 +2393,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
2345
2393
if (!tm -> tm_mon )
2346
2394
break ;
2347
2395
if (S_TM (n -> suffix ))
2348
- strcpy (s ,str_tolower_z (localized_abbrev_months [tm -> tm_mon - 1 ]));
2396
+ {
2397
+ char * str = str_tolower_z (localized_abbrev_months [tm -> tm_mon - 1 ]);
2398
+
2399
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2400
+ strcpy (s ,str );
2401
+ else
2402
+ ereport (ERROR ,
2403
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2404
+ errmsg ("localized string format value too long" )));
2405
+ }
2349
2406
else
2350
2407
strcpy (s ,asc_tolower_z (months [tm -> tm_mon - 1 ]));
2351
2408
s += strlen (s );
@@ -2359,7 +2416,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
2359
2416
case DCH_DAY :
2360
2417
INVALID_FOR_INTERVAL ;
2361
2418
if (S_TM (n -> suffix ))
2362
- strcpy (s ,str_toupper_z (localized_full_days [tm -> tm_wday ]));
2419
+ {
2420
+ char * str = str_toupper_z (localized_full_days [tm -> tm_wday ]);
2421
+
2422
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2423
+ strcpy (s ,str );
2424
+ else
2425
+ ereport (ERROR ,
2426
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2427
+ errmsg ("localized string format value too long" )));
2428
+ }
2363
2429
else
2364
2430
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2365
2431
asc_toupper_z (days [tm -> tm_wday ]));
@@ -2368,7 +2434,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
2368
2434
case DCH_Day :
2369
2435
INVALID_FOR_INTERVAL ;
2370
2436
if (S_TM (n -> suffix ))
2371
- strcpy (s ,str_initcap_z (localized_full_days [tm -> tm_wday ]));
2437
+ {
2438
+ char * str = str_initcap_z (localized_full_days [tm -> tm_wday ]);
2439
+
2440
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2441
+ strcpy (s ,str );
2442
+ else
2443
+ ereport (ERROR ,
2444
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2445
+ errmsg ("localized string format value too long" )));
2446
+ }
2372
2447
else
2373
2448
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2374
2449
days [tm -> tm_wday ]);
@@ -2377,7 +2452,16 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
2377
2452
case DCH_day :
2378
2453
INVALID_FOR_INTERVAL ;
2379
2454
if (S_TM (n -> suffix ))
2380
- strcpy (s ,str_tolower_z (localized_full_days [tm -> tm_wday ]));
2455
+ {
2456
+ char * str = str_tolower_z (localized_full_days [tm -> tm_wday ]);
2457
+
2458
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2459
+ strcpy (s ,str );
2460
+ else
2461
+ ereport (ERROR ,
2462
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2463
+ errmsg ("localized string format value too long" )));
2464
+ }
2381
2465
else
2382
2466
sprintf (s ,"%*s" ,S_FM (n -> suffix ) ?0 :-9 ,
2383
2467
asc_tolower_z (days [tm -> tm_wday ]));
@@ -2386,23 +2470,50 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
2386
2470
case DCH_DY :
2387
2471
INVALID_FOR_INTERVAL ;
2388
2472
if (S_TM (n -> suffix ))
2389
- strcpy (s ,str_toupper_z (localized_abbrev_days [tm -> tm_wday ]));
2473
+ {
2474
+ char * str = str_toupper_z (localized_abbrev_days [tm -> tm_wday ]);
2475
+
2476
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2477
+ strcpy (s ,str );
2478
+ else
2479
+ ereport (ERROR ,
2480
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2481
+ errmsg ("localized string format value too long" )));
2482
+ }
2390
2483
else
2391
2484
strcpy (s ,asc_toupper_z (days_short [tm -> tm_wday ]));
2392
2485
s += strlen (s );
2393
2486
break ;
2394
2487
case DCH_Dy :
2395
2488
INVALID_FOR_INTERVAL ;
2396
2489
if (S_TM (n -> suffix ))
2397
- strcpy (s ,str_initcap_z (localized_abbrev_days [tm -> tm_wday ]));
2490
+ {
2491
+ char * str = str_initcap_z (localized_abbrev_days [tm -> tm_wday ]);
2492
+
2493
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2494
+ strcpy (s ,str );
2495
+ else
2496
+ ereport (ERROR ,
2497
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2498
+ errmsg ("localized string format value too long" )));
2499
+ }
2398
2500
else
2399
2501
strcpy (s ,days_short [tm -> tm_wday ]);
2400
2502
s += strlen (s );
2401
2503
break ;
2402
2504
case DCH_dy :
2403
2505
INVALID_FOR_INTERVAL ;
2404
2506
if (S_TM (n -> suffix ))
2405
- strcpy (s ,str_tolower_z (localized_abbrev_days [tm -> tm_wday ]));
2507
+ {
2508
+ char * str = str_tolower_z (localized_abbrev_days [tm -> tm_wday ]);
2509
+
2510
+ if (strlen (str )< (n -> key -> len + TM_SUFFIX_LEN )* DCH_MAX_ITEM_SIZ )
2511
+ strcpy (s ,str );
2512
+ else
2513
+ ereport (ERROR ,
2514
+ (errcode (ERRCODE_DATETIME_VALUE_OUT_OF_RANGE ),
2515
+ errmsg ("localized string format value too long" )));
2516
+ }
2406
2517
else
2407
2518
strcpy (s ,asc_tolower_z (days_short [tm -> tm_wday ]));
2408
2519
s += strlen (s );