@@ -229,6 +229,7 @@ get_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int va
229229
230230#define RETURN_IF_NO_DATA if (ntuples < 1) \
231231{ \
232+ va_end(args); \
232233ecpg_raise(lineno, ECPG_NOT_FOUND, ECPG_SQLSTATE_NO_DATA, NULL); \
233234return (false); \
234235}
@@ -248,13 +249,17 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
248249ecpg_init_sqlca (sqlca );
249250ECPGresult = ecpg_result_by_descriptor (lineno ,desc_name );
250251if (!ECPGresult )
252+ {
253+ va_end (args );
251254return (false);
255+ }
252256
253257ntuples = PQntuples (ECPGresult );
254258
255259if (index < 1 || index > PQnfields (ECPGresult ))
256260{
257261ecpg_raise (lineno ,ECPG_INVALID_DESCRIPTOR_INDEX ,ECPG_SQLSTATE_INVALID_DESCRIPTOR_INDEX ,NULL );
262+ va_end (args );
258263return (false);
259264}
260265
@@ -312,68 +317,98 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
312317
313318case ECPGd_name :
314319if (!get_char_item (lineno ,var ,vartype ,PQfname (ECPGresult ,index ),varcharsize ))
320+ {
321+ va_end (args );
315322return (false);
323+ }
316324
317325ecpg_log ("ECPGget_desc: NAME = %s\n" ,PQfname (ECPGresult ,index ));
318326break ;
319327
320328case ECPGd_nullable :
321329if (!get_int_item (lineno ,var ,vartype ,1 ))
330+ {
331+ va_end (args );
322332return (false);
333+ }
323334
324335break ;
325336
326337case ECPGd_key_member :
327338if (!get_int_item (lineno ,var ,vartype ,0 ))
339+ {
340+ va_end (args );
328341return (false);
342+ }
329343
330344break ;
331345
332346case ECPGd_scale :
333347if (!get_int_item (lineno ,var ,vartype , (PQfmod (ECPGresult ,index )- VARHDRSZ )& 0xffff ))
348+ {
349+ va_end (args );
334350return (false);
351+ }
335352
336353ecpg_log ("ECPGget_desc: SCALE = %d\n" , (PQfmod (ECPGresult ,index )- VARHDRSZ )& 0xffff );
337354break ;
338355
339356case ECPGd_precision :
340357if (!get_int_item (lineno ,var ,vartype ,PQfmod (ECPGresult ,index ) >>16 ))
358+ {
359+ va_end (args );
341360return (false);
361+ }
342362
343363ecpg_log ("ECPGget_desc: PRECISION = %d\n" ,PQfmod (ECPGresult ,index ) >>16 );
344364break ;
345365
346366case ECPGd_octet :
347367if (!get_int_item (lineno ,var ,vartype ,PQfsize (ECPGresult ,index )))
368+ {
369+ va_end (args );
348370return (false);
371+ }
349372
350373ecpg_log ("ECPGget_desc: OCTET_LENGTH = %d\n" ,PQfsize (ECPGresult ,index ));
351374break ;
352375
353376case ECPGd_length :
354377if (!get_int_item (lineno ,var ,vartype ,PQfmod (ECPGresult ,index )- VARHDRSZ ))
378+ {
379+ va_end (args );
355380return (false);
381+ }
356382
357383ecpg_log ("ECPGget_desc: LENGTH = %d\n" ,PQfmod (ECPGresult ,index )- VARHDRSZ );
358384break ;
359385
360386case ECPGd_type :
361387if (!get_int_item (lineno ,var ,vartype ,ecpg_dynamic_type (PQftype (ECPGresult ,index ))))
388+ {
389+ va_end (args );
362390return (false);
391+ }
363392
364393ecpg_log ("ECPGget_desc: TYPE = %d\n" ,ecpg_dynamic_type (PQftype (ECPGresult ,index )));
365394break ;
366395
367396case ECPGd_di_code :
368397if (!get_int_item (lineno ,var ,vartype ,ecpg_dynamic_type_DDT (PQftype (ECPGresult ,index ))))
398+ {
399+ va_end (args );
369400return (false);
401+ }
370402
371403ecpg_log ("ECPGget_desc: TYPE = %d\n" ,ecpg_dynamic_type_DDT (PQftype (ECPGresult ,index )));
372404break ;
373405
374406case ECPGd_cardinality :
375407if (!get_int_item (lineno ,var ,vartype ,PQntuples (ECPGresult )))
408+ {
409+ va_end (args );
376410return (false);
411+ }
377412
378413ecpg_log ("ECPGget_desc: CARDINALITY = %d\n" ,PQntuples (ECPGresult ));
379414break ;
@@ -391,6 +426,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
391426ecpg_log ("ECPGget_desc on line %d: incorrect number of matches; %d don't fit into array of %ld\n" ,
392427lineno ,ntuples ,arrsize );
393428ecpg_raise (lineno ,ECPG_TOO_MANY_MATCHES ,ECPG_SQLSTATE_CARDINALITY_VIOLATION ,NULL );
429+ va_end (args );
394430return false;
395431}
396432/* allocate storage if needed */
@@ -399,7 +435,10 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
399435void * mem = (void * )ecpg_alloc (offset * ntuples ,lineno );
400436
401437if (!mem )
438+ {
439+ va_end (args );
402440return false;
441+ }
403442* (void * * )var = mem ;
404443ecpg_add_mem (mem ,lineno );
405444var = mem ;
@@ -408,7 +447,10 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
408447for (act_tuple = 0 ;act_tuple < ntuples ;act_tuple ++ )
409448{
410449if (!get_int_item (lineno ,var ,vartype ,PQgetlength (ECPGresult ,act_tuple ,index )))
450+ {
451+ va_end (args );
411452return (false);
453+ }
412454var = (char * )var + offset ;
413455ecpg_log ("ECPGget_desc: RETURNED[%d] = %d\n" ,act_tuple ,PQgetlength (ECPGresult ,act_tuple ,index ));
414456}
@@ -417,6 +459,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
417459default :
418460snprintf (type_str ,sizeof (type_str ),"%d" ,type );
419461ecpg_raise (lineno ,ECPG_UNKNOWN_DESCRIPTOR_ITEM ,ECPG_SQLSTATE_ECPG_INTERNAL_ERROR ,type_str );
462+ va_end (args );
420463return (false);
421464}
422465
@@ -460,6 +503,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
460503ecpg_log ("ECPGget_desc on line %d: incorrect number of matches (indicator); %d don't fit into array of %ld\n" ,
461504lineno ,ntuples ,data_var .ind_arrsize );
462505ecpg_raise (lineno ,ECPG_TOO_MANY_MATCHES ,ECPG_SQLSTATE_CARDINALITY_VIOLATION ,NULL );
506+ va_end (args );
463507return false;
464508}
465509
@@ -469,7 +513,10 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
469513void * mem = (void * )ecpg_alloc (data_var .ind_offset * ntuples ,lineno );
470514
471515if (!mem )
516+ {
517+ va_end (args );
472518return false;
519+ }
473520* (void * * )data_var .ind_pointer = mem ;
474521ecpg_add_mem (mem ,lineno );
475522data_var .ind_value = mem ;
@@ -478,12 +525,16 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
478525for (act_tuple = 0 ;act_tuple < ntuples ;act_tuple ++ )
479526{
480527if (!get_int_item (lineno ,data_var .ind_value ,data_var .ind_type ,- PQgetisnull (ECPGresult ,act_tuple ,index )))
528+ {
529+ va_end (args );
481530return (false);
531+ }
482532data_var .ind_value = (char * )data_var .ind_value + data_var .ind_offset ;
483533ecpg_log ("ECPGget_desc: INDICATOR[%d] = %d\n" ,act_tuple ,- PQgetisnull (ECPGresult ,act_tuple ,index ));
484534}
485535}
486536sqlca -> sqlerrd [2 ]= ntuples ;
537+ va_end (args );
487538return (true);
488539}
489540
@@ -575,6 +626,7 @@ ECPGset_desc(int lineno, const char *desc_name, int index,...)
575626if (!ecpg_store_input (lineno , true,var ,& tobeinserted , false))
576627{
577628ecpg_free (var );
629+ va_end (args );
578630return false;
579631}
580632
@@ -612,11 +664,13 @@ ECPGset_desc(int lineno, const char *desc_name, int index,...)
612664snprintf (type_str ,sizeof (type_str ),"%d" ,itemtype );
613665ecpg_raise (lineno ,ECPG_UNKNOWN_DESCRIPTOR_ITEM ,ECPG_SQLSTATE_ECPG_INTERNAL_ERROR ,type_str );
614666ecpg_free (var );
667+ va_end (args );
615668return false;
616669}
617670}
618671}
619672ecpg_free (var );
673+ va_end (args );
620674
621675return true;
622676}