|
@@ -594,14 +594,17 @@ static int rpc_scan(struct binrpc_ctx* ctx, char* fmt, ...)
|
|
int err;
|
|
int err;
|
|
char* orig_fmt;
|
|
char* orig_fmt;
|
|
int nofault;
|
|
int nofault;
|
|
|
|
+ int modifiers;
|
|
|
|
|
|
va_start(ap, fmt);
|
|
va_start(ap, fmt);
|
|
orig_fmt=fmt;
|
|
orig_fmt=fmt;
|
|
nofault = 0;
|
|
nofault = 0;
|
|
|
|
+ modifiers=0;
|
|
for (;*fmt; fmt++){
|
|
for (;*fmt; fmt++){
|
|
switch(*fmt){
|
|
switch(*fmt){
|
|
case '*': /* start of optional parameters */
|
|
case '*': /* start of optional parameters */
|
|
nofault = 1;
|
|
nofault = 1;
|
|
|
|
+ modifiers++;
|
|
break;
|
|
break;
|
|
case 'b': /* bool */
|
|
case 'b': /* bool */
|
|
case 't': /* time */
|
|
case 't': /* time */
|
|
@@ -652,9 +655,9 @@ static int rpc_scan(struct binrpc_ctx* ctx, char* fmt, ...)
|
|
ctx->in.record_no++;
|
|
ctx->in.record_no++;
|
|
}
|
|
}
|
|
va_end(ap);
|
|
va_end(ap);
|
|
- return (int)(fmt-orig_fmt);
|
|
|
|
|
|
+ return (int)(fmt-orig_fmt)-modifiers;
|
|
error_read:
|
|
error_read:
|
|
- if(nofault==0)
|
|
|
|
|
|
+ if(nofault==0 || ((err!=E_BINRPC_MORE_DATA) && (err!=E_BINRPC_EOP)))
|
|
rpc_fault(ctx, 400, "error at parameter %d: expected %s type but"
|
|
rpc_fault(ctx, 400, "error at parameter %d: expected %s type but"
|
|
" %s", ctx->in.record_no, rpc_type_name(v.type),
|
|
" %s", ctx->in.record_no, rpc_type_name(v.type),
|
|
binrpc_error(err));
|
|
binrpc_error(err));
|
|
@@ -675,7 +678,7 @@ error_inv_param:
|
|
*fmt);
|
|
*fmt);
|
|
error_ret:
|
|
error_ret:
|
|
va_end(ap);
|
|
va_end(ap);
|
|
- return -(int)(fmt-orig_fmt);
|
|
|
|
|
|
+ return -((int)(fmt-orig_fmt)-modifiers);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|