From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp30.i.mail.ru (smtp30.i.mail.ru [94.100.177.90]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 216E945C304 for ; Thu, 10 Dec 2020 17:15:28 +0300 (MSK) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.4\)) From: Sergey Ostanevich In-Reply-To: <09684330fa61f01381f05bbbc0e49e567a8a14a7.1607456485.git.lvasiliev@tarantool.org> Date: Thu, 10 Dec 2020 17:15:25 +0300 Content-Transfer-Encoding: quoted-printable Message-Id: <95BFAA11-3CB5-430E-938A-B3AF9701A38E@tarantool.org> References: <09684330fa61f01381f05bbbc0e49e567a8a14a7.1607456485.git.lvasiliev@tarantool.org> Subject: Re: [Tarantool-patches] [PATCH 1/2] sql: add missing diag_set on failure when working with files inside SQL module List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Leonid Vasiliev Cc: m.semkin@corp.mail.ru, tarantool-patches@dev.tarantool.org, Vladislav Shpilevoy , Mergen Imeev Thanks for the patch! I have a question if those diags are too low in the call stack? Apparently, the unixOpen() is a single space the robust_open() is called, so we=E2=80=99d have only one diag set instead of two? Following this path - we should just cover UNIXVFS and sql_io_methods members with diag set, given the errno is preserved. By now the solution is partial, so can be applied only if we=E2=80=99re = in a rush. Sergos > On 8 Dec 2020, at 22:59, Leonid Vasiliev = wrote: >=20 > From: Mergen Imeev >=20 > 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. >=20 > Part of #5537 > --- > src/box/sql/os_unix.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) >=20 > 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 =3D=3D EINTR) > continue; > + diag_set(SystemError, strerror(errno)); > break; > } > if (fd >=3D SQL_MINIMUM_FILE_DESCRIPTOR) > break; > close(fd); > fd =3D -1; > - if (open("/dev/null", f, m) < 0) > + if (open("/dev/null", f, m) < 0) { > + diag_set(SystemError, strerror(errno)); > break; > + } > } > if (fd >=3D 0) { > if (m !=3D 0) { > @@ -831,8 +834,10 @@ seekAndWriteFd(int fd, /* File = descriptor to write to */ > rc =3D write(fd, pBuf, nBuf); > } while (rc < 0 && errno =3D=3D EINTR); >=20 > - if (rc < 0) > + if (rc < 0) { > + diag_set(SystemError, strerror(errno)); > *piErrno =3D errno; > + } > return rc; > } >=20 > --=20 > 2.7.4 >=20