Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e47d5435 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Use sscanf() for parsing tag values.

Neither strtoll() nor strtoull() can parse the %llx formatted tag
values coming from the kernel.  We know the lowest 32 bits will never
be set, so fast-path the 3-character case as 0x0.

Bug: 17365163
Change-Id: I238bbd2830c9335e7ab7a53362d6e12b46e0bcb3
parent e0166059
Loading
Loading
Loading
Loading
+21 −15
Original line number Diff line number Diff line
@@ -175,28 +175,34 @@ static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats,
                continue;
            }
        }
        // Skip whitespace.
        while (*pos == ' ') {
            pos++;
        }
        // Next field is tag.
        rawTag = strtoll(pos, &endPos, 16);
        //ALOGI("Index #%d: %s", idx, buffer);
        if (pos == endPos) {

        // Ignore whitespace
        while (*pos == ' ') pos++;

        // Find end of tag field
        endPos = pos;
        while (*endPos != ' ') endPos++;

        // Three digit field is always 0x0, otherwise parse
        if (endPos - pos == 3) {
            rawTag = 0;
        } else {
            if (sscanf(pos, "%llx", &rawTag) != 1) {
                ALOGE("bad tag: %s", pos);
                fclose(fp);
                return -1;
            }
        }
        s.tag = rawTag >> 32;
        if (limitTag != -1 && s.tag != limitTag) {
            //ALOGI("skipping due to tag: %s", buffer);
            continue;
        }
        pos = endPos;
        // Skip whitespace.
        while (*pos == ' ') {
            pos++;
        }

        // Ignore whitespace
        while (*pos == ' ') pos++;

        // Parse remaining fields.
        if (sscanf(pos, "%u %u %llu %llu %llu %llu",
                &s.uid, &s.set, &s.rxBytes, &s.rxPackets,