From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C8357C0015E for ; Sun, 23 Jul 2023 02:02:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 07AAC6B0072; Sat, 22 Jul 2023 22:02:45 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 02B306B0074; Sat, 22 Jul 2023 22:02:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E36886B0075; Sat, 22 Jul 2023 22:02:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id D12B66B0072 for ; Sat, 22 Jul 2023 22:02:44 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 9A6E616079C for ; Sun, 23 Jul 2023 02:02:44 +0000 (UTC) X-FDA: 81041227848.26.D39CDAC Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) by imf26.hostedemail.com (Postfix) with ESMTP id BF922140008 for ; Sun, 23 Jul 2023 02:02:42 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20221208 header.b=KzmI0GVD; spf=pass (imf26.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.208.178 as permitted sender) smtp.mailfrom=alexei.starovoitov@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1690077762; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=CxXqztj5OtaboYjZJG2RhBj3enmq0GMAVkQwjxk3WaM=; b=Lme2dh/sL/tvjDKbUPZjHzjRlOxWwkyPCBbiNIAxvAzoJI2UMaL//7Aug3zgrFOSCVlEZi BmE19PGRXvDjQFCecve3gLUdKTzMhl5OE6NJn2EYiM9fNkwU6gRp/7w2n+Wi0W/6RX2bmv 5ItSJqCU0KP2ge7kgLF9kcm7CUu5q8I= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690077762; a=rsa-sha256; cv=none; b=RxYqXkBd1v/lphWQqQjCk8oTnLJQtOxVmZ4/yD9SHXosE0aAaZUVsEabQ8Y24B8Fctt/CP 4PzCrFfzsaawDIBpLHNTBO2RiFPdov3oi3Xd0J00dHBcnyPm2u0HVHLHOV+4dSlCL8FOZT Ugo9kSJMJxMu2JRJA06yVElwbNiRD3w= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20221208 header.b=KzmI0GVD; spf=pass (imf26.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.208.178 as permitted sender) smtp.mailfrom=alexei.starovoitov@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-lj1-f178.google.com with SMTP id 38308e7fff4ca-2b95efb9d89so46869761fa.0 for ; Sat, 22 Jul 2023 19:02:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1690077761; x=1690682561; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=CxXqztj5OtaboYjZJG2RhBj3enmq0GMAVkQwjxk3WaM=; b=KzmI0GVDBAVsb+2SsO5TF0mSZnnJB9lI55c9iArQ7WqfJtwhG0Y53aJp6aYCqQrenY 7w6K1l3hUJpYBUI2na591nMv5ukdZXBX0wTQR69L75a1MlemSZ1PJN78gM9xg+A4BneO SDa5q1spEGrwRCVFhwb6ENzdriiMJltHJpGu896p0Zcl+7N2bn8owTQEousVkhZrVqTT VcqgH/qkI+XqZ5NPkcaGYf39SaOXHN/WOFZfvkA5O1Qs8LamYoSvN/dAYZMwAIeKXweM seN4KjzldN/0lrnL51NOV4KA6AoZtm4p1v21gx9yEd6eLrRvwA9q6V5D6+PtijPH668i pfgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690077761; x=1690682561; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CxXqztj5OtaboYjZJG2RhBj3enmq0GMAVkQwjxk3WaM=; b=dlMwn2CvBHTzZXgiFowFwwbDXVWcD9azwvZvvuDiYfszcMKZ4qvLpmvI9GzRykrMxG VkPAlJ/g2OP1xif3ALmsOCSPJ0kDD7y7k2onH+VO6xNu+fI+sp3AnCEupOy/zxG8L6j7 QQb0EcOrU1YO3aBpN5jpnls6lj2pSLZpvhj7bOmhI8wbUYQTLPPMDqkjIqVEy55qkD8I ECaoOLvZvHXM1C6WHpmtSNZCLXei+f+e5zxzY8Cp+qBkrSv780oJ8SXVIm5aub3NNVjV 6d3rYnu+siRu9a+wwynwbObEdp7Hpsp55T7MwxSON48YnpKWG/FzsR54xODFMJPJe43/ NCpg== X-Gm-Message-State: ABy/qLZbvbQ/QMyUtcyV4OqfQjEV7P5x9xmcrm2uIAjVUhugiT6E/Gla V6Vb2VkCMqnAotggOTfqFVlo2ML0FtRoff3Eltc= X-Google-Smtp-Source: APBJJlFOUkirrJ9kb1G3aNFcsCoIimvObe12ggBhf/OK/05/RgMz+f8feFW2/xIRgU1rXbAWhHF8M23AQtCKrawjxXg= X-Received: by 2002:a2e:9283:0:b0:2b6:eeb3:da94 with SMTP id d3-20020a2e9283000000b002b6eeb3da94mr3695037ljh.22.1690077760516; Sat, 22 Jul 2023 19:02:40 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Alexei Starovoitov Date: Sat, 22 Jul 2023 19:02:29 -0700 Message-ID: Subject: Re: bpf: bpf_probe_read_user_str() returns 0 for empty strings To: Bagas Sanjaya Cc: Ingo Molnar , Masami Hiramatsu , "Steven Rostedt (Google)" , Max Froehling , Linux Kernel Mailing List , Linux BPF , Linux Memory Management List Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Stat-Signature: a4nz9wxk973f8k5yp3gwpoe9qoz6srmr X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: BF922140008 X-Rspam-User: X-HE-Tag: 1690077762-455204 X-HE-Meta: U2FsdGVkX1/bezC9exzGhFnhk6cDlcCi1EYo94IsutRJi0z8a7jK4Wpn3nnMviRn7aU1PA12XL9PUhrdwQFM3NOxoaq8pbqsTr8AeWropdzOc7XxPtRBkDRyYHIjuPM+ft6xZZUwRAiXDm4ZZgva9597SEmkcCePzsAY15n1S+nKQH+3b3olfhlxC8itWagDUaPXRixjO05iHOEA4ilx21D+ezosnolUlU1CRoqDCYlxhaRaJ0GUaQMhqkduGKXtZ5Xy7oo8hMuGNGTtXy8J18nJDuo1z9/6dhUwIBMBMlu5aNuhPZXdN1/Pw1T5YvhjBMJjfDS+TOYNrrH2hZngmPYRZW7L/a5cRgxBgZ/3U8nkiZGwpDZyklV9LE+LE4UHKxxNar/ZnR+q76AgNxLTNvZ+2APBxkUzTUeg53axh8cCzxkgShujSrQLZsbx9rjBiotIs3JSYQfKn0Xg7qPNKwphddETvH3yqVFTHzfvpyVFItn3aUp3apLZ5zbmaTmN1cD1Sif/ADGrw2ZYDQOpUHCzD1ayEnFz5qt4XzyWirbhXrkZMCe//m2WMNIQAbfOUQA7WQQf6pNJzAYhY4SC5iGpDYxSo5P5ZWAcx3/OYCiRNf52GsmGSCMTgUZstF6yXsiXUNc4RxMNnPxs0u6j7f5oxqQryXFn/PgjjG4NimEFOY1ZY+KgnXaA51IAXYP3msQvrH6vTr22uWPvsVBYtz9Pxlc8x4d9DfTGwMuO8VqjeXh9FPgpUDIK8Vf0lDtslTEdIjs2hPvlLGdLRAvzM0EGLHEoXZEBPT9Pogi1BrI3QWERT7XSSrNju0vcv8Xpy+g9g5HtaE/SDiwfotU+tfPapLw+H1ZoqF6/BEjIQAqVnAp4HVM9cafAicyx3a/wnyfd8rqUPdoSgQiuF6EOQr+YrQ0uer/RWZVEMINDWhhEp+A08DebTteBs27pcIzcuqy5hoXUwcM1TPCab/h YcIKxoCM jIFY5WVUp3pJmEZVjDxsz6S5kAyt5RuSeqKuqFUw0Tv61OY1kQWNKvwuMA78THtv6tCUnEDkotDRS+hHZzZu2x/gKA84CuNIvT8iu1CO2mXKbLz34XhTBTZ9GkxUb+V7MFO7hbKa2Hj0SdD7lcI3uW1NuBfDcUxQC887Ev6vNaQM0Pj6iHxMCu+OsT7hOzjOJr+RDcBWM72NeEbT+CgpN6XCUa9hi/X9SsNhVi7mo394/WXLTTcU60jRFwLnt/OVnPtWAJg0GzRLZP+H1GA6RfbKrbIubjESIcIv/AMYuNbrnIEYajr/TA9bKNkstVLKy6M6CX2oJ99adegq4ghebAOUoxjBsjLTpgMeM4L1P665HgPKclJPyE3J79wzBsEspReD1RNeaGPsA+YF74mRmWjlKbZa0n/FKvvT5DjxVxNhb7auzsPwJ2of9Sht2iIif3tNlA1IsKktk323XqCdJlFeKPkdxU3P1wIZe X-Bogosity: Ham, tests=bogofilter, spamicity=0.000382, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Sat, Jul 22, 2023 at 6:53=E2=80=AFPM Bagas Sanjaya wrote: > > Hi, > > I notice a bug report on Bugzilla [1]. Quoting from it: > > > Overview: > > > > From within eBPF, calling the helper function bpf_probe_read_user_str(v= oid *dst, __u32 size, const void *unsafe_ptr returns 0 when the source stri= ng (void *unsafe_ptr) consists of a string containing only a single null-by= te. > > > > This violates various functions documentations (the helper and various = internal kernel functions), which all state: Sounds like the bugzilla author believes it's a documentation issue. If so, please encourage the author to send the patch to fix the doc. > > > >> On success, the strictly positive length of the output string, > >> including the trailing NUL character. On error, a negative value. > > > > To me, this states that the function should return 1 for char myString[= ] =3D ""; However, this is not the case. The function returns 0 instead. > > > > For non-empty strings, it works as expected. For example, char myString= [] =3D "abc"; returns 4. > > > > Steps to Reproduce: > > * Write an eBPF program that calls bpf_probe_read_user_str(), using a u= serspace pointer pointing to an empty string. > > * Store the result value of that function > > * Do the same thing, but try out bpf_probe_read_kernel_str(), like this= : > > char empty[] =3D ""; > > char copy[5]; > > long ret =3D bpf_probe_read_kernel_str(copy, 5, empty); > > * Compare the return value of bpf_probe_read_user_str() and bpf_probe_r= ead_kernel_str() > > > > Expected Result: > > > > Both functions return 1 (because of the single NULL byte). > > > > Actual Result: > > > > bpf_probe_read_user_str() returns 0, while bpf_probe_read_kernel_str() = returns 1. > > > > Additional Information: > > > > I believe I can see the bug on the current Linux kernel master branch. > > > > In the file/function mm/maccess.c::strncpy_from_user_nofault() the help= er implementation calls strncpy_from_user(), which returns the length witho= ut trailing 0. Hence this function returns 0 for an empty string. > > > > However, in line 192 (as of commit fdf0eaf11452d72945af31804e2a1048ee1b= 574c) there is a check that only increments ret, if it is > 0. This appears= to be the logic that adds the trailing null byte. Since the check only doe= s this for a ret > 0, a ret of 0 remains at 0. > > > > This is a possible off-by-one error that might cause the behavior. > > See Bugzilla for the full thread. > > FYI, the culprit line is introduced by commit 3d7081822f7f9e ("uaccess: A= dd > non-pagefault user-space read functions"). I Cc: culprit SoB so that they > can look into this bug. > > Thanks. > > [1]: https://bugzilla.kernel.org/show_bug.cgi?id=3D217679 > > -- > An old man doll... just what I always wanted! - Clara >