Skip to content

Commit 06aedb9

Browse files
[GBAK] Correct handling of NULLs in RDB$RETURN_ARGUMENT and RDB$ARGUMENT_POSITION (#7875)
It is a fix for issue #7869
1 parent 4cd3b0e commit 06aedb9

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

src/burp/backup.epp

+19-5
Original file line numberDiff line numberDiff line change
@@ -2839,7 +2839,10 @@ void write_functions()
28392839
BURP_verbose (147, temp);
28402840
// msg 147 writing function %.*s
28412841
put_source_blob (att_function_description2, att_function_description, X.RDB$DESCRIPTION);
2842-
put_int32 (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
2842+
2843+
if (!X.RDB$RETURN_ARGUMENT.NULL)
2844+
put_int32 (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
2845+
28432846
put_int32 (att_function_type, X.RDB$FUNCTION_TYPE);
28442847
PUT_TEXT (att_function_query_name, X.RDB$QUERY_NAME);
28452848

@@ -2893,7 +2896,10 @@ void write_functions()
28932896
put_source_blob (att_function_description2, att_function_description, X.RDB$DESCRIPTION);
28942897
PUT_TEXT (att_function_module_name, X.RDB$MODULE_NAME);
28952898
PUT_TEXT (att_function_entrypoint, X.RDB$ENTRYPOINT);
2896-
put_int32 (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
2899+
2900+
if (!X.RDB$RETURN_ARGUMENT.NULL)
2901+
put_int32 (att_function_return_arg, X.RDB$RETURN_ARGUMENT);
2902+
28972903
put_int32 (att_function_type, X.RDB$FUNCTION_TYPE);
28982904
PUT_TEXT (att_function_query_name, X.RDB$QUERY_NAME);
28992905
put(tdgbl, att_end);
@@ -2955,7 +2961,9 @@ void write_function_args(const GDS_NAME package, GDS_NAME funcptr)
29552961
BURP_verbose (141, temp);
29562962
// msg 141 writing argument for function %s
29572963

2958-
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
2964+
if (!X.RDB$ARGUMENT_POSITION.NULL)
2965+
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
2966+
29592967
put_int32 (att_functionarg_passing_mechanism, X.RDB$MECHANISM);
29602968
put_int32 (att_functionarg_field_type, X.RDB$FIELD_TYPE);
29612969
put_int32 (att_functionarg_field_scale, X.RDB$FIELD_SCALE);
@@ -3006,7 +3014,10 @@ void write_function_args(const GDS_NAME package, GDS_NAME funcptr)
30063014
MISC_terminate (X.RDB$FUNCTION_NAME, temp, l, sizeof(temp));
30073015
BURP_verbose (141, temp);
30083016
// msg 141 writing argument for function %s
3009-
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3017+
3018+
if (!X.RDB$ARGUMENT_POSITION.NULL)
3019+
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3020+
30103021
put_int32 (att_functionarg_passing_mechanism, X.RDB$MECHANISM);
30113022
put_int32 (att_functionarg_field_type, X.RDB$FIELD_TYPE);
30123023
put_int32 (att_functionarg_field_scale, X.RDB$FIELD_SCALE);
@@ -3034,7 +3045,10 @@ void write_function_args(const GDS_NAME package, GDS_NAME funcptr)
30343045
MISC_terminate (X.RDB$FUNCTION_NAME, temp, l, sizeof(temp));
30353046
BURP_verbose (141, temp);
30363047
// msg 141 writing argument for function %s
3037-
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3048+
3049+
if (!X.RDB$ARGUMENT_POSITION.NULL)
3050+
put_int32 (att_functionarg_position, X.RDB$ARGUMENT_POSITION);
3051+
30383052
put_int32 (att_functionarg_passing_mechanism, X.RDB$MECHANISM);
30393053
put_int32 (att_functionarg_field_type, X.RDB$FIELD_TYPE);
30403054
put_int32 (att_functionarg_field_scale, X.RDB$FIELD_SCALE);

src/burp/restore.epp

+10
Original file line numberDiff line numberDiff line change
@@ -4384,6 +4384,7 @@ bool get_function(BurpGlobals* tdgbl)
43844384
X.RDB$OWNER_NAME.NULL = TRUE;
43854385
X.RDB$MODULE_NAME.NULL = TRUE;
43864386
X.RDB$ENTRYPOINT.NULL = TRUE;
4387+
X.RDB$RETURN_ARGUMENT.NULL = TRUE;
43874388

43884389
X.RDB$SYSTEM_FLAG.NULL = FALSE;
43894390
X.RDB$SYSTEM_FLAG = 0;
@@ -4440,6 +4441,7 @@ bool get_function(BurpGlobals* tdgbl)
44404441
break;
44414442

44424443
case att_function_return_arg:
4444+
X.RDB$RETURN_ARGUMENT.NULL = FALSE;
44434445
X.RDB$RETURN_ARGUMENT = (USHORT) get_int32(tdgbl);
44444446
break;
44454447

@@ -4599,6 +4601,7 @@ bool get_function(BurpGlobals* tdgbl)
45994601
STORE (TRANSACTION_HANDLE local_trans
46004602
REQUEST_HANDLE tdgbl->handles_get_function_req_handle1)
46014603
X IN RDB$FUNCTIONS
4604+
X.RDB$RETURN_ARGUMENT.NULL = TRUE;
46024605
X.RDB$SYSTEM_FLAG = 0;
46034606
X.RDB$SYSTEM_FLAG.NULL = FALSE;
46044607
X.RDB$DESCRIPTION.NULL = TRUE;
@@ -4634,6 +4637,7 @@ bool get_function(BurpGlobals* tdgbl)
46344637
break;
46354638

46364639
case att_function_return_arg:
4640+
X.RDB$RETURN_ARGUMENT.NULL = FALSE;
46374641
X.RDB$RETURN_ARGUMENT = (USHORT) get_int32(tdgbl);
46384642
break;
46394643

@@ -4851,6 +4855,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
48514855
STORE (TRANSACTION_HANDLE local_trans
48524856
REQUEST_HANDLE tdgbl->handles_get_function_arg_req_handle1)
48534857
X IN RDB$FUNCTION_ARGUMENTS
4858+
X.RDB$ARGUMENT_POSITION.NULL = TRUE;
48544859
X.RDB$FIELD_SUB_TYPE.NULL = TRUE;
48554860
X.RDB$CHARACTER_SET_ID.NULL = TRUE;
48564861
X.RDB$FIELD_PRECISION.NULL = TRUE;
@@ -4894,6 +4899,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
48944899
break;
48954900

48964901
case att_functionarg_position:
4902+
X.RDB$ARGUMENT_POSITION.NULL = FALSE;
48974903
X.RDB$ARGUMENT_POSITION = (USHORT) get_int32(tdgbl);
48984904
break;
48994905

@@ -5061,6 +5067,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
50615067
STORE (TRANSACTION_HANDLE local_trans
50625068
REQUEST_HANDLE tdgbl->handles_get_function_arg_req_handle1)
50635069
X IN RDB$FUNCTION_ARGUMENTS
5070+
X.RDB$ARGUMENT_POSITION.NULL = TRUE;
50645071
X.RDB$FIELD_SUB_TYPE.NULL = TRUE;
50655072
X.RDB$CHARACTER_SET_ID.NULL = TRUE;
50665073
X.RDB$FIELD_PRECISION.NULL = TRUE;
@@ -5078,6 +5085,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
50785085
break;
50795086

50805087
case att_functionarg_position:
5088+
X.RDB$ARGUMENT_POSITION.NULL = FALSE;
50815089
X.RDB$ARGUMENT_POSITION = (USHORT) get_int32(tdgbl);
50825090
break;
50835091

@@ -5175,6 +5183,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
51755183
STORE (TRANSACTION_HANDLE local_trans
51765184
REQUEST_HANDLE tdgbl->handles_get_function_arg_req_handle1)
51775185
X IN RDB$FUNCTION_ARGUMENTS
5186+
X.RDB$ARGUMENT_POSITION.NULL = TRUE;
51785187
X.RDB$FIELD_SUB_TYPE.NULL = TRUE;
51795188
X.RDB$CHARACTER_SET_ID.NULL = TRUE;
51805189

@@ -5191,6 +5200,7 @@ void get_function_arg(BurpGlobals* tdgbl, bool skip_arguments)
51915200
break;
51925201

51935202
case att_functionarg_position:
5203+
X.RDB$ARGUMENT_POSITION.NULL = FALSE;
51945204
X.RDB$ARGUMENT_POSITION = (USHORT) get_int32(tdgbl);
51955205
break;
51965206

0 commit comments

Comments
 (0)