[libc][syscalls] 在标准输入输出前加校验,反正在libc初始化之前调用printf出问题

This commit is contained in:
Meco Man 2021-09-27 06:51:40 -04:00
parent c8c632512a
commit 86bb54fde6
4 changed files with 46 additions and 2 deletions

View File

@ -25,6 +25,10 @@
#include <dfs_posix.h> #include <dfs_posix.h>
#endif #endif
#define DBG_TAG "armlibc.syscalls"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
#ifdef __CLANG_ARM #ifdef __CLANG_ARM
__asm(".global __use_no_semihosting\n\t"); __asm(".global __use_no_semihosting\n\t");
#else #else
@ -146,6 +150,11 @@ int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode)
if (fh == STDIN) if (fh == STDIN)
{ {
#ifdef RT_USING_POSIX #ifdef RT_USING_POSIX
if (libc_stdio_get_console() < 0)
{
LOG_E("invoke standard output before initializing libc");
return -1;
}
size = read(STDIN_FILENO, buf, len); size = read(STDIN_FILENO, buf, len);
return len - size; return len - size;
#else #else
@ -186,6 +195,11 @@ int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
return 0; return 0;
#else #else
#ifdef RT_USING_POSIX #ifdef RT_USING_POSIX
if (libc_stdio_get_console() < 0)
{
LOG_E("invoke standard input before initializing libc");
return -1;
}
size = write(STDOUT_FILENO, buf, len); size = write(STDOUT_FILENO, buf, len);
return len - size; return len - size;
#else #else

View File

@ -15,6 +15,10 @@
#include <yfuns.h> #include <yfuns.h>
#include "libc.h" #include "libc.h"
#define DBG_TAG "dlib.syscall_read"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
#pragma module_name = "?__read" #pragma module_name = "?__read"
size_t __read(int handle, unsigned char *buf, size_t len) size_t __read(int handle, unsigned char *buf, size_t len)
{ {
@ -25,6 +29,11 @@ size_t __read(int handle, unsigned char *buf, size_t len)
if (handle == _LLIO_STDIN) if (handle == _LLIO_STDIN)
{ {
#ifdef RT_USING_POSIX #ifdef RT_USING_POSIX
if (libc_stdio_get_console() < 0)
{
LOG_E("invoke standard input before initializing libc");
return _LLIO_ERROR;
}
return read(STDIN_FILENO, buf, len); return read(STDIN_FILENO, buf, len);
#else #else
return _LLIO_ERROR; return _LLIO_ERROR;

View File

@ -15,6 +15,10 @@
#include <yfuns.h> #include <yfuns.h>
#include "libc.h" #include "libc.h"
#define DBG_TAG "dlib.syscall_write"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
#pragma module_name = "?__write" #pragma module_name = "?__write"
size_t __write(int handle, const unsigned char *buf, size_t len) size_t __write(int handle, const unsigned char *buf, size_t len)
@ -30,6 +34,11 @@ size_t __write(int handle, const unsigned char *buf, size_t len)
#else #else
#ifdef RT_USING_POSIX #ifdef RT_USING_POSIX
if (libc_stdio_get_console() < 0)
{
LOG_E("invoke standard output before initializing libc");
return _LLIO_ERROR;
}
return write(STDOUT_FILENO, (void*)buf, len); return write(STDOUT_FILENO, (void*)buf, len);
#else #else
rt_device_t console_device; rt_device_t console_device;

View File

@ -26,6 +26,10 @@
#include <dlmodule.h> #include <dlmodule.h>
#endif #endif
#define DBG_TAG "newlib.syscalls"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
/* Reentrant versions of system calls. */ /* Reentrant versions of system calls. */
#ifndef _REENT_ONLY #ifndef _REENT_ONLY
@ -155,7 +159,11 @@ _ssize_t _read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes)
return -1; return -1;
#else #else
_ssize_t rc; _ssize_t rc;
if (libc_stdio_get_console() < 0 && fd == STDIN_FILENO)
{
LOG_E("invoke standard input before initializing libc");
return -1;
}
rc = read(fd, buf, nbytes); rc = read(fd, buf, nbytes);
return rc; return rc;
#endif #endif
@ -227,7 +235,11 @@ _ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
#endif /*RT_USING_DEVICE*/ #endif /*RT_USING_DEVICE*/
#else #else
_ssize_t rc; _ssize_t rc;
if (libc_stdio_get_console() < 0 && fd == STDOUT_FILENO)
{
LOG_E("invoke standard output before initializing libc");
return -1;
}
rc = write(fd, buf, nbytes); rc = write(fd, buf, nbytes);
return rc; return rc;
#endif #endif