/* Return the length of a string in target memory or -TARGET_EFAULT if access error */ abi_long target_strlen(abi_ulong guest_addr1) { uint8_t *ptr; abi_ulong guest_addr; int max_len, len; guest_addr = guest_addr1; for(;;) { max_len = TARGET_PAGE_SIZE - (guest_addr & ~TARGET_PAGE_MASK); ptr = lock_user(VERIFY_READ, guest_addr, max_len, 1); if (!ptr) return -TARGET_EFAULT; len = qemu_strnlen(ptr, max_len); unlock_user(ptr, guest_addr, 0); guest_addr += len; /* we don't allow wrapping or integer overflow */ if (guest_addr == 0 || (guest_addr - guest_addr1) > 0x7fffffff) return -TARGET_EFAULT; if (len != max_len) break; } return guest_addr - guest_addr1; }
void strpadcpy(char *buf, int buf_size, const char *str, char pad) { int len = qemu_strnlen(str, buf_size); memcpy(buf, str, len); memset(buf + len, pad, buf_size - len); }