Skip to content

Commit 892d6bf

Browse files
[FB4, GBAK] Correct handling of NULLs in RDB$RETURN_ARGUMENT and RDB$ARGUMENT_POSITION (#7870)
* [GBAK, restore] Initialization of RDB$RETURN_ARGUMENT and RDB$ARGUMENT_POSITION to NULL value This is a fix for issue #7869 - potential problem of writing into database the uninitialized value in RDB$RETURN_ARGUMENT and RDB$ARGUMENT_POSITION columns. get_function - inits X.RDB$RETURN_ARGUMENT.NULL - IF >=DB_VERSION_DDL12 - ELSE get_function_arg - inits X.RDB$ARGUMENT_POSITION.NULL - IF >=DB_VERSION_DDL12 - IF >=DB_VERSION_DDL10 - ELSE * [GBAK, backup] Skip RDB$RETURN_ARGUMENT and RDB$ARGUMENT_POSITION with NULL value. Thanks to Adriano. This is a fix for symmetric problem with RDB$RETURN_ARGUMENT and RDB$ARGUMENT_POSITION in backup. write_functions write_function_args
1 parent 03153aa commit 892d6bf

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

src/burp/backup.epp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2905,7 +2905,10 @@ void write_functions()
29052905
BURP_verbose (147, temp);
29062906
// msg 147 writing function %.*s
29072907
put_source_blob (att_function_description2, att_function_description, X.RDB$DESCRIPTION);
2908-
put_int32 (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
2908+
2909+
if (!X.RDB$RETURN_ARGUMENT.NULL)
2910+
put_int32 (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
2911+
29092912
put_int32 (att_function_type, X.RDB$FUNCTION_TYPE);
29102913
PUT_TEXT (att_function_query_name, X.RDB$QUERY_NAME);
29112914

@@ -2959,7 +2962,10 @@ void write_functions()
29592962
put_source_blob (att_function_description2, att_function_description, X.RDB$DESCRIPTION);
29602963
PUT_TEXT (att_function_module_name, X.RDB$MODULE_NAME);
29612964
PUT_TEXT (att_function_entrypoint, X.RDB$ENTRYPOINT);
2962-
put_int32 (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
2965+
2966+
if (!X.RDB$RETURN_ARGUMENT.NULL)
2967+
put_int32 (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
2968+
29632969
put_int32 (att_function_type, X.RDB$FUNCTION_TYPE);
29642970
PUT_TEXT (att_function_query_name, X.RDB$QUERY_NAME);
29652971
put(tdgbl, att_end);
@@ -3021,7 +3027,9 @@ void write_function_args(const GDS_NAME package, GDS_NAME funcptr)
30213027
BURP_verbose (141, temp);
30223028
// msg 141 writing argument for function %s
30233029

3024-
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3030+
if (!X.RDB$ARGUMENT_POSITION.NULL)
3031+
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3032+
30253033
put_int32 (att_functionarg_passing_mechanism, X.RDB$MECHANISM);
30263034
put_int32 (att_functionarg_field_type, X.RDB$FIELD_TYPE);
30273035
put_int32 (att_functionarg_field_scale, X.RDB$FIELD_SCALE);
@@ -3072,7 +3080,10 @@ void write_function_args(const GDS_NAME package, GDS_NAME funcptr)
30723080
MISC_terminate (X.RDB$FUNCTION_NAME, temp, l, sizeof(temp));
30733081
BURP_verbose (141, temp);
30743082
// msg 141 writing argument for function %s
3075-
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3083+
3084+
if (!X.RDB$ARGUMENT_POSITION.NULL)
3085+
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3086+
30763087
put_int32 (att_functionarg_passing_mechanism, X.RDB$MECHANISM);
30773088
put_int32 (att_functionarg_field_type, X.RDB$FIELD_TYPE);
30783089
put_int32 (att_functionarg_field_scale, X.RDB$FIELD_SCALE);
@@ -3100,7 +3111,10 @@ void write_function_args(const GDS_NAME package, GDS_NAME funcptr)
31003111
MISC_terminate (X.RDB$FUNCTION_NAME, temp, l, sizeof(temp));
31013112
BURP_verbose (141, temp);
31023113
// msg 141 writing argument for function %s
3103-
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3114+
3115+
if (!X.RDB$ARGUMENT_POSITION.NULL)
3116+
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3117+
31043118
put_int32 (att_functionarg_passing_mechanism, X.RDB$MECHANISM);
31053119
put_int32 (att_functionarg_field_type, X.RDB$FIELD_TYPE);
31063120
put_int32 (att_functionarg_field_scale, X.RDB$FIELD_SCALE);

src/burp/restore.epp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5017,6 +5017,7 @@ bool get_function(BurpGlobals* tdgbl)
50175017
X.RDB$OWNER_NAME.NULL = TRUE;
50185018
X.RDB$MODULE_NAME.NULL = TRUE;
50195019
X.RDB$ENTRYPOINT.NULL = TRUE;
5020+
X.RDB$RETURN_ARGUMENT.NULL = TRUE;
50205021

50215022
X.RDB$SYSTEM_FLAG.NULL = FALSE;
50225023
X.RDB$SYSTEM_FLAG = 0;
@@ -5073,6 +5074,7 @@ bool get_function(BurpGlobals* tdgbl)
50735074
break;
50745075

50755076
case att_function_return_arg:
5077+
X.RDB$RETURN_ARGUMENT.NULL = FALSE;
50765078
X.RDB$RETURN_ARGUMENT = (USHORT) get_int32(tdgbl);
50775079
break;
50785080

@@ -5232,6 +5234,7 @@ bool get_function(BurpGlobals* tdgbl)
52325234
STORE (TRANSACTION_HANDLE local_trans
52335235
REQUEST_HANDLE tdgbl->handles_get_function_req_handle1)
52345236
X IN RDB$FUNCTIONS
5237+
X.RDB$RETURN_ARGUMENT.NULL = TRUE;
52355238
X.RDB$SYSTEM_FLAG = 0;
52365239
X.RDB$SYSTEM_FLAG.NULL = FALSE;
52375240
X.RDB$DESCRIPTION.NULL = TRUE;
@@ -5267,6 +5270,7 @@ bool get_function(BurpGlobals* tdgbl)
52675270
break;
52685271

52695272
case att_function_return_arg:
5273+
X.RDB$RETURN_ARGUMENT.NULL = FALSE;
52705274
X.RDB$RETURN_ARGUMENT = (USHORT) get_int32(tdgbl);
52715275
break;
52725276

@@ -5484,6 +5488,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
54845488
STORE (TRANSACTION_HANDLE local_trans
54855489
REQUEST_HANDLE tdgbl->handles_get_function_arg_req_handle1)
54865490
X IN RDB$FUNCTION_ARGUMENTS
5491+
X.RDB$ARGUMENT_POSITION.NULL = TRUE;
54875492
X.RDB$FIELD_SUB_TYPE.NULL = TRUE;
54885493
X.RDB$CHARACTER_SET_ID.NULL = TRUE;
54895494
X.RDB$FIELD_PRECISION.NULL = TRUE;
@@ -5527,6 +5532,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
55275532
break;
55285533

55295534
case att_functionarg_position:
5535+
X.RDB$ARGUMENT_POSITION.NULL = FALSE;
55305536
X.RDB$ARGUMENT_POSITION = (USHORT) get_int32(tdgbl);
55315537
break;
55325538

@@ -5694,6 +5700,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
56945700
STORE (TRANSACTION_HANDLE local_trans
56955701
REQUEST_HANDLE tdgbl->handles_get_function_arg_req_handle1)
56965702
X IN RDB$FUNCTION_ARGUMENTS
5703+
X.RDB$ARGUMENT_POSITION.NULL = TRUE;
56975704
X.RDB$FIELD_SUB_TYPE.NULL = TRUE;
56985705
X.RDB$CHARACTER_SET_ID.NULL = TRUE;
56995706
X.RDB$FIELD_PRECISION.NULL = TRUE;
@@ -5711,6 +5718,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
57115718
break;
57125719

57135720
case att_functionarg_position:
5721+
X.RDB$ARGUMENT_POSITION.NULL = FALSE;
57145722
X.RDB$ARGUMENT_POSITION = (USHORT) get_int32(tdgbl);
57155723
break;
57165724

@@ -5808,6 +5816,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
58085816
STORE (TRANSACTION_HANDLE local_trans
58095817
REQUEST_HANDLE tdgbl->handles_get_function_arg_req_handle1)
58105818
X IN RDB$FUNCTION_ARGUMENTS
5819+
X.RDB$ARGUMENT_POSITION.NULL = TRUE;
58115820
X.RDB$FIELD_SUB_TYPE.NULL = TRUE;
58125821
X.RDB$CHARACTER_SET_ID.NULL = TRUE;
58135822

@@ -5824,6 +5833,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
58245833
break;
58255834

58265835
case att_functionarg_position:
5836+
X.RDB$ARGUMENT_POSITION.NULL = FALSE;
58275837
X.RDB$ARGUMENT_POSITION = (USHORT) get_int32(tdgbl);
58285838
break;
58295839

0 commit comments

Comments
 (0)