[Tarantool-patches] [PATCH v2 1/3] sql: add missing diag_set on failure when working with files inside SQL module
Leonid Vasiliev
lvasiliev at tarantool.org
Mon Dec 14 18:49:22 MSK 2020
Hi! Thank you for the review.
On 13.12.2020 21:30, Vladislav Shpilevoy wrote:
> Hi! Thanks for the patchset!
>
> On 11.12.2020 15:49, Leonid Vasiliev wrote:
>> From: Mergen Imeev <imeevma at gmail.com>
>>
>> SQL module didn't set an error in the diagnostics area on a file
>> operation failure. This could lead to a crash like in #5537.
>>
>> Part of #5537
>> ---
>> src/box/sql/os_unix.c | 9 +++++++--
>> 1 file changed, 7 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/box/sql/os_unix.c b/src/box/sql/os_unix.c
>> index b351c55..557d709 100644
>> --- a/src/box/sql/os_unix.c
>> +++ b/src/box/sql/os_unix.c
>> @@ -159,14 +159,17 @@ robust_open(const char *z, int f, mode_t m)
>> if (fd < 0) {
>> if (errno == EINTR)
>> continue;
>> + diag_set(SystemError, strerror(errno));
>> break;
>
> SystemError already reports strerror() in ::log() method.
> I don't think you need to duplicate it. Better add a proper
> description. For example, the path. Grep "diag_set(SystemError"
> in our project and see other usages which try to provide
> more info. The same in other places.
I thought about adding more info to the error, but it seems to me that
only "trace" is useful here. I do not mind your proposal. See full diff
at the end of the letter
>
>> }
>> if (fd >= SQL_MINIMUM_FILE_DESCRIPTOR)
>> break;
>> close(fd);
>> fd = -1;
>> - if (open("/dev/null", f, m) < 0)
>> + if (open("/dev/null", f, m) < 0) {
>> + diag_set(SystemError, strerror(errno));
>> break;
>> + }
>> }
>> if (fd >= 0) {
>> if (m != 0) {
>> @@ -831,8 +834,10 @@ seekAndWriteFd(int fd, /* File descriptor to write to */
>> rc = write(fd, pBuf, nBuf);
>> } while (rc < 0 && errno == EINTR);
>>
>> - if (rc < 0)
>> + if (rc < 0) {
>> + diag_set(SystemError, strerror(errno));
>> *piErrno = errno;
>> + }
>> return rc;
>> }
>>
>>
src/box/sql/os_unix.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/box/sql/os_unix.c b/src/box/sql/os_unix.c
index b351c55..ea7d3cc 100644
--- a/src/box/sql/os_unix.c
+++ b/src/box/sql/os_unix.c
@@ -159,14 +159,17 @@ robust_open(const char *z, int f, mode_t m)
if (fd < 0) {
if (errno == EINTR)
continue;
+ diag_set(SystemError, "failed to open file '%s'", z);
break;
}
if (fd >= SQL_MINIMUM_FILE_DESCRIPTOR)
break;
close(fd);
fd = -1;
- if (open("/dev/null", f, m) < 0)
+ if (open("/dev/null", f, m) < 0) {
+ diag_set(SystemError, "failed to open '/dev/null'");
break;
+ }
}
if (fd >= 0) {
if (m != 0) {
@@ -831,8 +834,10 @@ seekAndWriteFd(int fd, /* File descriptor to write
to */
rc = write(fd, pBuf, nBuf);
} while (rc < 0 && errno == EINTR);
- if (rc < 0)
+ if (rc < 0) {
+ diag_set(SystemError, "failed to write %i bytes to file", nBuf);
*piErrno = errno;
+ }
return rc;
}
More information about the Tarantool-patches
mailing list