@@ -455,6 +455,7 @@ static void legacy_iq_setup(struct ireq *iq, void *setup_data)
455455 iq -> setup_data = setup_data ;
456456 iq -> has_ssl = clnt -> plugin .has_ssl (clnt );
457457 iq -> identity = clnt -> plugin .get_identity (clnt );
458+ iq -> origin_argv0 = clnt -> origin_argv0 ;
458459 get_client_origin (iq -> corigin , sizeof (iq -> corigin ), clnt );
459460}
460461
@@ -468,6 +469,12 @@ static int dispatch_tagged(struct sqlclntstate *clnt)
468469 p_slock = pool_getablk (p_slocks );
469470 Pthread_mutex_unlock (& buf_lock );
470471
472+ if (appdata -> sqlquery == NULL || appdata -> sqlquery -> n_bindvars < 3 || appdata -> sqlquery -> bindvars [0 ] == NULL ||
473+ appdata -> sqlquery -> bindvars [1 ] == NULL || appdata -> sqlquery -> bindvars [1 ]-> value .len != sizeof (int ) ||
474+ appdata -> sqlquery -> bindvars [2 ] == NULL || appdata -> sqlquery -> bindvars [2 ]-> value .len != sizeof (int )) {
475+ return 1 ;
476+ }
477+
471478 void * buf = appdata -> sqlquery -> bindvars [0 ]-> value .data ;
472479 int sz = appdata -> sqlquery -> bindvars [0 ]-> value .len ;
473480
@@ -479,10 +486,18 @@ static int dispatch_tagged(struct sqlclntstate *clnt)
479486 p_slock -> reply_state = REPLY_STATE_NA ;
480487
481488 clnt -> authdata = get_authdata (clnt );
482- if (appdata -> sqlquery == NULL || appdata -> sqlquery -> n_bindvars < 3 || appdata -> sqlquery -> bindvars [0 ] == NULL ||
483- appdata -> sqlquery -> bindvars [1 ] == NULL || appdata -> sqlquery -> bindvars [1 ]-> value .len != sizeof (int ) ||
484- appdata -> sqlquery -> bindvars [2 ] == NULL || appdata -> sqlquery -> bindvars [2 ]-> value .len != sizeof (int )) {
485- return 1 ;
489+
490+ if (appdata -> sqlquery -> n_bindvars > 3 && appdata -> sqlquery -> bindvars [3 ] &&
491+ appdata -> sqlquery -> bindvars [3 ]-> value .data ) {
492+ // note - we specifically don't override clnt->argv0 here - we want
493+ // the original sender (typically the proxy) there, and we save on whose behalf we're
494+ // proxying elsewhere.
495+ if (clnt -> origin_argv0 ) {
496+ free (clnt -> origin_argv0 );
497+ clnt -> origin_argv0 = NULL ;
498+ }
499+ clnt -> origin_argv0 =
500+ strndup ((char * )appdata -> sqlquery -> bindvars [3 ]-> value .data , appdata -> sqlquery -> bindvars [3 ]-> value .len );
486501 }
487502
488503 int luxref ;
0 commit comments