Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
ecpg: Fix error handling on OOMs when parsing timestamps
authorMichael Paquier <michael@paquier.xyz>
Mon, 19 Feb 2024 00:05:51 +0000 (09:05 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 19 Feb 2024 00:05:51 +0000 (09:05 +0900)
pgtypes_alloc() can return NULL when failing an allocation, which is
something that PGTYPEStimestamp_defmt_asc() has forgotten about when
translating a timestamp for 'D', 'r', 'R' and 'T' as these require a
temporary allocation.

This is unlikely going to be a problem in practice, so no backpatch is
done.

Author: Oleg Tselebrovskiy
Discussion: https://postgr.es/m/bf47888585149f83b276861a1662f7e4@postgrespro.ru

src/interfaces/ecpg/pgtypeslib/dt_common.c

index 99bdc94d6d73bb2b4dc8db164a4120d9e4c36bac..ed08088bfe1320052aa87bc78f351a2e733aa245 100644 (file)
@@ -2659,6 +2659,8 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d,
                 */
                pfmt++;
                tmp = pgtypes_alloc(strlen("%m/%d/%y") + strlen(pstr) + 1);
+               if (!tmp)
+                   return 1;
                strcpy(tmp, "%m/%d/%y");
                strcat(tmp, pfmt);
                err = PGTYPEStimestamp_defmt_scan(&pstr, tmp, d, year, month, day, hour, minute, second, tz);
@@ -2784,6 +2786,8 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d,
            case 'r':
                pfmt++;
                tmp = pgtypes_alloc(strlen("%I:%M:%S %p") + strlen(pstr) + 1);
+               if (!tmp)
+                   return 1;
                strcpy(tmp, "%I:%M:%S %p");
                strcat(tmp, pfmt);
                err = PGTYPEStimestamp_defmt_scan(&pstr, tmp, d, year, month, day, hour, minute, second, tz);
@@ -2792,6 +2796,8 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d,
            case 'R':
                pfmt++;
                tmp = pgtypes_alloc(strlen("%H:%M") + strlen(pstr) + 1);
+               if (!tmp)
+                   return 1;
                strcpy(tmp, "%H:%M");
                strcat(tmp, pfmt);
                err = PGTYPEStimestamp_defmt_scan(&pstr, tmp, d, year, month, day, hour, minute, second, tz);
@@ -2837,6 +2843,8 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d,
            case 'T':
                pfmt++;
                tmp = pgtypes_alloc(strlen("%H:%M:%S") + strlen(pstr) + 1);
+               if (!tmp)
+                   return 1;
                strcpy(tmp, "%H:%M:%S");
                strcat(tmp, pfmt);
                err = PGTYPEStimestamp_defmt_scan(&pstr, tmp, d, year, month, day, hour, minute, second, tz);