8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.117 2002/03/06 06:10:42 momjian Exp $
11
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.118 2002/04/08 03:48:10 ishii Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -115,6 +115,7 @@ PQescapeString(char *to, const char *from, size_t length)
115
115
* '\0' == ASCII 0 == \\000
116
116
* '\'' == ASCII 39 == \'
117
117
* '\\' == ASCII 92 == \\\\
118
+ * anything >= 0x80 ---> \\ooo (where ooo is an octal expression)
118
119
*/
119
120
unsigned char *
120
121
PQescapeBytea (unsigned char * bintext , size_t binlen , size_t * bytealen )
@@ -131,40 +132,39 @@ PQescapeBytea(unsigned char *bintext, size_t binlen, size_t *bytealen)
131
132
len = 1 ;
132
133
133
134
vp = bintext ;
134
- for (i = binlen ; i != 0 ; i -- , vp ++ )
135
+ for (i = binlen ; i > 0 ; i -- , vp ++ )
135
136
{
136
- if (* vp == 0 )
137
- len += 5 ;
138
- else if (* vp == 39 )
137
+ if (* vp == 0 || * vp >= 0x80 )
138
+ len += 5 ; /* '5' is for '\\ooo' */
139
+ else if (* vp == '\'' )
139
140
len += 2 ;
140
- else if (* vp == 92 )
141
+ else if (* vp == '\\' )
141
142
len += 4 ;
142
143
else
143
144
len ++ ;
144
145
}
145
146
146
147
rp = result = (unsigned char * ) malloc (len );
148
+ if (rp == NULL )
149
+ return NULL ;
150
+
147
151
vp = bintext ;
148
152
* bytealen = len ;
149
153
150
- for (i = binlen ; i != 0 ; i -- , vp ++ )
154
+ for (i = binlen ; i > 0 ; i -- , vp ++ )
151
155
{
152
- if (* vp == 0 )
156
+ if (* vp == 0 || * vp >= 0x80 )
153
157
{
154
- rp [0 ] = '\\' ;
155
- rp [1 ] = '\\' ;
156
- rp [2 ] = '0' ;
157
- rp [3 ] = '0' ;
158
- rp [4 ] = '0' ;
158
+ (void )sprintf (rp ,"\\\\%03o" ,* vp );
159
159
rp += 5 ;
160
160
}
161
- else if (* vp == 39 )
161
+ else if (* vp == '\'' )
162
162
{
163
163
rp [0 ] = '\\' ;
164
164
rp [1 ] = '\'' ;
165
165
rp += 2 ;
166
166
}
167
- else if (* vp == 92 )
167
+ else if (* vp == '\\' )
168
168
{
169
169
rp [0 ] = '\\' ;
170
170
rp [1 ] = '\\' ;
@@ -224,34 +224,36 @@ PQunescapeBytea(unsigned char *strtext, size_t *retbuflen)
224
224
if (* sp == '\'' ) /* state=5 */
225
225
{ /* replace \' with 39 */
226
226
bp -- ;
227
- * bp = 39 ;
227
+ * bp = '\'' ;
228
228
buflen -- ;
229
229
state = 0 ;
230
230
}
231
231
else if (* sp == '\\' ) /* state=6 */
232
232
{ /* replace \\ with 92 */
233
233
bp -- ;
234
- * bp = 92 ;
234
+ * bp = '\\' ;
235
235
buflen -- ;
236
236
state = 0 ;
237
237
}
238
238
else
239
239
{
240
- if (* sp == '0' )state = 2 ;
240
+ if (isdigit ( * sp ) )state = 2 ;
241
241
else state = 0 ;
242
242
* bp = * sp ;
243
243
}
244
244
break ;
245
245
case 2 :
246
- if (* sp == '0' )state = 3 ;
246
+ if (isdigit ( * sp ) )state = 3 ;
247
247
else state = 0 ;
248
248
* bp = * sp ;
249
249
break ;
250
250
case 3 :
251
- if (* sp == '0' ) /* state=4 */
251
+ if (isdigit ( * sp ) ) /* state=4 */
252
252
{
253
+ int v ;
253
254
bp -= 3 ;
254
- * bp = 0 ;
255
+ sscanf (sp - 2 , "%03o" , & v );
256
+ * bp = v ;
255
257
buflen -= 3 ;
256
258
state = 0 ;
257
259
}
@@ -263,7 +265,9 @@ PQunescapeBytea(unsigned char *strtext, size_t *retbuflen)
263
265
break ;
264
266
}
265
267
}
266
- realloc (buffer ,buflen );
268
+ buffer = realloc (buffer ,buflen );
269
+ if (buffer == NULL )
270
+ return NULL ;
267
271
268
272
* retbuflen = buflen ;
269
273
return buffer ;
0 commit comments