diff options
-rw-r--r-- | cmds/screencap/screencap.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp index ee9c464219d9..2d235331a672 100644 --- a/cmds/screencap/screencap.cpp +++ b/cmds/screencap/screencap.cpp @@ -142,13 +142,22 @@ int main(int argc, char** argv) case 'p': png = true; break; - case 'd': - displayIdOpt = DisplayId::fromValue(atoll(optarg)); + case 'd': { + errno = 0; + char* end = nullptr; + const uint64_t id = strtoull(optarg, &end, 10); + if (!end || *end != '\0' || errno == ERANGE) { + fprintf(stderr, "Invalid display ID: Out of range [0, 2^64).\n"); + return 1; + } + + displayIdOpt = DisplayId::fromValue(id); if (!displayIdOpt) { - fprintf(stderr, "Invalid display ID: %s\n", optarg); + fprintf(stderr, "Invalid display ID: Incorrect encoding.\n"); return 1; } break; + } case '?': case 'h': if (ids.size() == 1) { |