Skip to content

Commit 8be5d7c

Browse files
committed
Mismatch log fixes
1 parent a628913 commit 8be5d7c

File tree

4 files changed

+27
-17
lines changed

4 files changed

+27
-17
lines changed

src/flamenco/log_collector/fd_log_collector.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "fd_log_collector_base.h"
55
#include "../runtime/context/fd_exec_instr_ctx.h"
66
#include "../runtime/context/fd_exec_txn_ctx.h"
7+
#include "../vm/fd_vm_base.h"
78
#include "../../ballet/base58/fd_base58.h"
89
#include "../../ballet/base64/fd_base64.h"
910
#include <stdio.h>
@@ -484,8 +485,15 @@ fd_log_collector_program_failure( fd_exec_instr_ctx_t * ctx ) {
484485

485486
/* Skip empty string, this means that the msg has already been logged. */
486487
if( FD_LIKELY( err[0] ) ) {
487-
char err_prefix[ 17+FD_BASE58_ENCODED_32_SZ ]; // 17==strlen("Program failed: ")
488-
int err_prefix_len = sprintf( err_prefix, "Program %s failed: ", ctx->program_id_base58 );
488+
/* Agave logs syscall errors with "Syscall error: " prefix when they cannot be
489+
downcast to InstructionError. */
490+
char err_prefix[ 17+FD_BASE58_ENCODED_32_SZ+15 ]; // 17==strlen("Program failed: "), 15==strlen("Syscall error: ")
491+
int needs_prefix = ( txn_ctx->exec_err_kind==FD_EXECUTOR_ERR_KIND_SYSCALL ) &&
492+
( txn_ctx->exec_err==FD_VM_SYSCALL_ERR_UNALIGNED_POINTER ||
493+
txn_ctx->exec_err==FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY ||
494+
txn_ctx->exec_err==FD_VM_SYSCALL_ERR_TOO_MANY_SIGNERS );
495+
const char * prefix = needs_prefix ? "Syscall error: " : "";
496+
int err_prefix_len = sprintf( err_prefix, "Program %s failed: %s", ctx->program_id_base58, prefix );
489497
if( err_prefix_len > 0 ) {
490498
/* Equivalent to: "Program %s failed: %s" */
491499
fd_log_collector_msg_many( ctx, 2, err_prefix, (ulong)err_prefix_len, err, (ulong)strlen(err) );

src/flamenco/vm/fd_vm.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ fd_vm_syscall_strerror( int err ) {
2525
case FD_VM_SYSCALL_ERR_RETURN_DATA_TOO_LARGE: return "Return data too large"; // truncated
2626
case FD_VM_SYSCALL_ERR_TOO_MANY_SLICES: return "Hashing too many sequences";
2727
case FD_VM_SYSCALL_ERR_INVALID_LENGTH: return "InvalidLength";
28+
case FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY: return "Invalid length";
2829
case FD_VM_SYSCALL_ERR_MAX_INSTRUCTION_DATA_LEN_EXCEEDED: return "Invoked an instruction with data that is too large"; // truncated
2930
case FD_VM_SYSCALL_ERR_MAX_INSTRUCTION_ACCOUNTS_EXCEEDED: return "Invoked an instruction with too many accounts"; // truncated
3031
case FD_VM_SYSCALL_ERR_MAX_INSTRUCTION_ACCOUNT_INFOS_EXCEEDED: return "Invoked an instruction with too many account info's"; // truncated

src/flamenco/vm/fd_vm_base.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
#define FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED (-24) /* compute unit limit exceeded in syscall */
8888
#define FD_VM_SYSCALL_ERR_SEGFAULT (-25) /* illegal memory address (e.g. read/write to an address not backed by any memory) in syscall */
8989
#define FD_VM_SYSCALL_ERR_OUTSIDE_RUNTIME (-26) /* syscall called with vm not running in solana runtime */
90+
#define FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY (-27) /* memory translation error: "Invalid length" (with space) */
9091

9192
/* Poseidon returns custom errors for some reason */
9293
#define FD_VM_SYSCALL_ERR_POSEIDON_INVALID_PARAMS (1)

src/flamenco/vm/syscall/fd_vm_syscall_macros.h

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ typedef struct fd_vm_haddr_query fd_vm_haddr_query_t;
9393
ulong _haddr = fd_vm_mem_haddr( vm, _vaddr, (sz), _vm->region_haddr, _vm->region_ld_sz, 0, 0UL ); \
9494
int _sigbus = fd_vm_is_check_align_enabled( vm ) & (!fd_ulong_is_aligned( _haddr, (align) )); \
9595
if ( FD_UNLIKELY( sz > LONG_MAX ) ) { \
96-
FD_VM_ERR_FOR_LOG_SYSCALL( _vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH ); \
97-
return FD_VM_SYSCALL_ERR_SEGFAULT; \
96+
FD_VM_ERR_FOR_LOG_SYSCALL( _vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY ); \
97+
return FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY; \
9898
} \
9999
if( FD_UNLIKELY( (!_haddr) ) ) { \
100100
_vm->segv_vaddr = _vaddr; \
@@ -105,7 +105,7 @@ typedef struct fd_vm_haddr_query fd_vm_haddr_query_t;
105105
} \
106106
if ( FD_UNLIKELY( _sigbus ) ) { \
107107
FD_VM_ERR_FOR_LOG_SYSCALL( _vm, FD_VM_SYSCALL_ERR_UNALIGNED_POINTER ); \
108-
return FD_VM_SYSCALL_ERR_SEGFAULT; \
108+
return FD_VM_SYSCALL_ERR_UNALIGNED_POINTER; \
109109
} \
110110
(void const *)_haddr; \
111111
}))
@@ -129,8 +129,8 @@ FD_VM_MEM_HADDR_ST_( fd_vm_t *vm, ulong vaddr, ulong align, ulong sz, int *err )
129129
ulong _haddr = fd_vm_mem_haddr( vm, _vaddr, (sz), _vm->region_haddr, _vm->region_st_sz, 1, 0UL );
130130
int _sigbus = fd_vm_is_check_align_enabled( vm ) & (!fd_ulong_is_aligned( _haddr, (align) ));
131131
if ( FD_UNLIKELY( sz > LONG_MAX ) ) {
132-
FD_VM_ERR_FOR_LOG_SYSCALL( _vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH );
133-
*err = FD_VM_SYSCALL_ERR_SEGFAULT;
132+
FD_VM_ERR_FOR_LOG_SYSCALL( _vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY );
133+
*err = FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY;
134134
return 0;
135135
}
136136
if( FD_UNLIKELY( (!_haddr) ) ) {
@@ -143,7 +143,7 @@ FD_VM_MEM_HADDR_ST_( fd_vm_t *vm, ulong vaddr, ulong align, ulong sz, int *err )
143143
}
144144
if ( FD_UNLIKELY( _sigbus ) ) {
145145
FD_VM_ERR_FOR_LOG_SYSCALL( _vm, FD_VM_SYSCALL_ERR_UNALIGNED_POINTER );
146-
*err = FD_VM_SYSCALL_ERR_SEGFAULT;
146+
*err = FD_VM_SYSCALL_ERR_UNALIGNED_POINTER;
147147
return 0;
148148
}
149149
return (void *)_haddr;
@@ -170,8 +170,8 @@ FD_VM_MEM_HADDR_ST_( fd_vm_t *vm, ulong vaddr, ulong align, ulong sz, int *err )
170170
ulong _haddr = fd_vm_mem_haddr( vm, _vaddr, (sz), _vm->region_haddr, _vm->region_st_sz, 0, 0UL ); \
171171
int _sigbus = fd_vm_is_check_align_enabled( vm ) & (!fd_ulong_is_aligned( _haddr, (align) )); \
172172
if ( FD_UNLIKELY( sz > LONG_MAX ) ) { \
173-
FD_VM_ERR_FOR_LOG_SYSCALL( _vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH ); \
174-
return FD_VM_SYSCALL_ERR_SEGFAULT; \
173+
FD_VM_ERR_FOR_LOG_SYSCALL( _vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY ); \
174+
return FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY; \
175175
} \
176176
if( FD_UNLIKELY( !_haddr ) ) { \
177177
_vm->segv_vaddr = _vaddr; \
@@ -182,7 +182,7 @@ FD_VM_MEM_HADDR_ST_( fd_vm_t *vm, ulong vaddr, ulong align, ulong sz, int *err )
182182
} \
183183
if ( FD_UNLIKELY( _sigbus ) ) { \
184184
FD_VM_ERR_FOR_LOG_SYSCALL( _vm, FD_VM_SYSCALL_ERR_UNALIGNED_POINTER ); \
185-
return FD_VM_SYSCALL_ERR_SEGFAULT; \
185+
return FD_VM_SYSCALL_ERR_UNALIGNED_POINTER; \
186186
} \
187187
(void *)_haddr; \
188188
}))
@@ -230,8 +230,8 @@ FD_VM_MEM_HADDR_ST_( fd_vm_t *vm, ulong vaddr, ulong align, ulong sz, int *err )
230230
LONG_MAX. */
231231
#define FD_VM_MEM_SLICE_HADDR_LD( vm, vaddr, align, sz ) (__extension__({ \
232232
if ( FD_UNLIKELY( sz > LONG_MAX ) ) { \
233-
FD_VM_ERR_FOR_LOG_SYSCALL( vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH ); \
234-
return FD_VM_SYSCALL_ERR_INVALID_LENGTH; \
233+
FD_VM_ERR_FOR_LOG_SYSCALL( vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY ); \
234+
return FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY; \
235235
} \
236236
void const * haddr = 0UL; \
237237
if ( FD_LIKELY( (ulong)sz > 0UL ) ) { \
@@ -245,8 +245,8 @@ FD_VM_MEM_HADDR_ST_( fd_vm_t *vm, ulong vaddr, ulong align, ulong sz, int *err )
245245
loads with no size bounding support. */
246246
#define FD_VM_MEM_SLICE_HADDR_LD_SZ_UNCHECKED( vm, vaddr, align ) (__extension__({ \
247247
if ( FD_UNLIKELY( sz > LONG_MAX ) ) { \
248-
FD_VM_ERR_FOR_LOG_SYSCALL( vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH ); \
249-
return FD_VM_SYSCALL_ERR_INVALID_LENGTH; \
248+
FD_VM_ERR_FOR_LOG_SYSCALL( vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY ); \
249+
return FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY; \
250250
} \
251251
void const * haddr = 0UL; \
252252
if ( FD_LIKELY( (ulong)sz > 0UL ) ) { \
@@ -257,8 +257,8 @@ FD_VM_MEM_HADDR_ST_( fd_vm_t *vm, ulong vaddr, ulong align, ulong sz, int *err )
257257

258258
#define FD_VM_MEM_SLICE_HADDR_ST( vm, vaddr, align, sz ) (__extension__({ \
259259
if ( FD_UNLIKELY( sz > LONG_MAX ) ) { \
260-
FD_VM_ERR_FOR_LOG_SYSCALL( vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH ); \
261-
return FD_VM_SYSCALL_ERR_INVALID_LENGTH; \
260+
FD_VM_ERR_FOR_LOG_SYSCALL( vm, FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY ); \
261+
return FD_VM_SYSCALL_ERR_INVALID_LENGTH_MEMORY; \
262262
} \
263263
void * haddr = 0UL; \
264264
if ( FD_LIKELY( (ulong)sz > 0UL ) ) { \

0 commit comments

Comments
 (0)