int do_test (void) { /* The easiest way to set up the conditions under which you can notice whether the end-of-file indicator is sticky, is with a pseudo-tty. This is also the case which applications are most likely to care about. And it avoids any question of whether and how it is legitimate to access the same physical file with two independent FILE objects. */ int outer_fd, inner_fd; FILE *fp; support_openpty (&outer_fd, &inner_fd, 0, 0, 0); fp = fdopen (inner_fd, "r+"); if (!fp) { perror ("fdopen"); return 1; } XWRITE (outer_fd, "abc\n\004", "first line + EOF"); TEST_COMPARE (fgetwc (fp), L'a'); TEST_COMPARE (fgetwc (fp), L'b'); TEST_COMPARE (fgetwc (fp), L'c'); TEST_COMPARE (fgetwc (fp), L'\n'); TEST_COMPARE (fgetwc (fp), WEOF); TEST_VERIFY_EXIT (feof (fp)); TEST_VERIFY_EXIT (!ferror (fp)); XWRITE (outer_fd, "d\n", "second line"); /* At this point, there is a new full line of input waiting in the kernelside input buffer, but we should still observe EOF from stdio, because the end-of-file indicator has not been cleared. */ TEST_COMPARE (fgetwc (fp), WEOF); /* Clearing EOF should reveal the next line of input. */ clearerr (fp); TEST_COMPARE (fgetwc (fp), L'd'); TEST_COMPARE (fgetwc (fp), L'\n'); fclose (fp); close (outer_fd); return 0; }
/* Make hash ! */ int cmd_kmem_hash() { int i, fd, len, new_size; revmlist_t *actual, *second; char buff[BUFSIZ]; char buffhash[BUFSIZ]; eresi_Addr vaddr; unsigned char *hashbuffer; char *tmp; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); memset(buff, '\0', sizeof(buff)); memset(buffhash, '\0', sizeof(buffhash)); vaddr = -1; actual = world.curjob->curcmd->disasm + 0; second = world.curjob->curcmd->disasm + 1; if (actual->rname) { kernsh_addrlen(actual, &vaddr, &len); hashbuffer = kernsh_hash(vaddr+actual->off, len, &new_size); if (hashbuffer == NULL) { PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Unable to make hash", -1); } i = 0; tmp = buffhash; while(hashbuffer[i] != '\0') { sprintf(tmp, "%02x", hashbuffer[i]); i++; tmp += 2; } snprintf(buff, sizeof(buff), "MD5 @ %s : \n\t%s\n\n", revm_coloraddress(XFMT, (eresi_Addr) vaddr), revm_colorstr((char *)buffhash)); revm_output(buff); snprintf(buff, sizeof(buff), "%s:%s:%s:%s:%s:%s\n\n", revm_coloraddress(XFMT, (eresi_Addr) vaddr), revm_colornumber("%u", libkernshworld.mem), revm_colornumber("%u", (int)config_get_data(LIBKERNSH_CONFIG_HASH)), revm_colornumber("%u", new_size), revm_colornumber("%u", actual->off), revm_colorstr((char *)buffhash)); revm_output(buff); snprintf(buff, sizeof(buff), "0x%lx:%d:%d:%d:%d:%s\n", (unsigned long) vaddr, libkernshworld.mem, (int)config_get_data(LIBKERNSH_CONFIG_HASH), new_size, actual->off, buffhash); revm_setvar_str(REVM_VAR_RESULT, (char *)buffhash); export_var((char *)buffhash, 0, 0, buff, 2); if (second != NULL && second->rname != NULL) { XOPEN(fd, second->rname, O_CREAT|O_APPEND|O_RDWR, 0777, -1); memset(buff, '\0', sizeof(buff)); snprintf(buff, sizeof(buff), "0x%lx:%d:%d:%d:%d:%s\n", (unsigned long) vaddr, libkernshworld.mem, (int)config_get_data(LIBKERNSH_CONFIG_HASH), new_size, actual->off, buffhash); XWRITE(fd, buff, strlen(buff), -1); XCLOSE(fd, -1); } } XFREE(__FILE__, __FUNCTION__, __LINE__, hashbuffer); revm_endline(); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); }
/** * @brief Extract and gunzip the linux kernel\n * Configure :\n * LIBKERNSH_CONFIG_KERNEL, LIBKERNSH_CONFIG_STORAGE_PATH, LIBKERNSH_CONFIG_KERNELGZ, LIBKERNSH_CONFIG_KERNELELF, LIBKERNSH_CONFIG_OBJCOPY, LIBKERNSH_CONFIG_GZIP * @return 0 on success, -1 on error */ int kernsh_decompkernel_linux() { char magic[] = { 0x1f, 0x8b, 0x08 }; char buf[256]; char bufgz[256]; char bufelf[256]; char decomp[256]; struct stat st; int fd, fz; int size; char *begin, *zone; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); #if __DEBUG_KERNSH__ printf("DECOMP KERNEL LINUX\n"); #endif XOPEN(fd, (char *) config_get_data(LIBKERNSH_CONFIG_KERNEL), O_RDONLY, 0, -1); #if __DEBUG_KERNSH__ printf("OPEN KERNEL @ %s\n", (char *) config_get_data(LIBKERNSH_CONFIG_KERNEL)); #endif if(fstat(fd, &st) == -1) { PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "fd error", -1); } #if defined(__linux__) XMMAP(zone, NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0, -1); #endif #if __DEBUG_KERNSH__ printf("MMAP size %d @ 0x%lx\n", (int)st.st_size, (unsigned long) zone); #endif begin = kernsh_find_pattern(zone, st.st_size, magic, 3); #if __DEBUG_KERNSH__ printf("FIND MAGIC GZIP PATTERN @ 0x%lx\n", (unsigned long) begin); #endif size = st.st_size - ((int)begin - (int)zone); memset(buf, '\0', sizeof(buf)); snprintf(buf, sizeof(buf), "%s%s", (char *) config_get_data(LIBKERNSH_CONFIG_STORAGE_PATH), (char *) config_get_data(LIBKERNSH_CONFIG_KERNELGZ)); XOPEN(fz, buf, O_CREAT|O_RDWR, 0777, -1); #if __DEBUG_KERNSH__ printf("OPEN GZ KERNEL @ %s\n", buf); #endif XWRITE(fz, begin, size, -1); XCLOSE(fz, -1); #if defined(__linux__) XMUNMAP(zone, st.st_size, -1); #endif XCLOSE(fd, -1); memset(decomp, '\0', sizeof(decomp)); snprintf(decomp, sizeof(decomp), "%s -d -f %s%s", (char *) config_get_data(LIBKERNSH_CONFIG_GZIP), (char *) config_get_data(LIBKERNSH_CONFIG_STORAGE_PATH), (char *) config_get_data(LIBKERNSH_CONFIG_KERNELGZ)); #if __DEBUG_KERNSH__ printf("DECOMP %s\n", decomp); #endif system(decomp); memset(bufgz, '\0', sizeof(bufgz)); snprintf(bufgz, sizeof(bufgz), "%s%s", (char *) config_get_data(LIBKERNSH_CONFIG_STORAGE_PATH), (char *) config_get_data(LIBKERNSH_CONFIG_KERNELGZ)); bufgz[strlen(bufgz) - 3] = '\0'; memset(bufelf, '\0', sizeof(bufelf)); snprintf(bufelf, sizeof(bufelf), "%s%s", (char *) config_get_data(LIBKERNSH_CONFIG_STORAGE_PATH), (char *) config_get_data(LIBKERNSH_CONFIG_KERNELELF)); memset(buf, '\0', sizeof(buf)); snprintf(buf, sizeof(buf) , "%s -B i386 -I binary -O elf32-i386 %s %s", (char *) config_get_data(LIBKERNSH_CONFIG_OBJCOPY), bufgz, bufelf); #if __DEBUG_KERNSH__ printf("EXTRACT ELF FROM DATA @ %s%s\n", (char *) config_get_data(LIBKERNSH_CONFIG_STORAGE_PATH), (char *) config_get_data(LIBKERNSH_CONFIG_KERNELELF)); #endif system(buf); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); }