Skip to content

UnicodeDecodeError exception is raised when an unreadable file is in profile dir #182

@JulienP1

Description

@JulienP1

When an unreadble file is present in profile directory the the exception UnicodeDecodeError: 'utf-8' codec can't decode byte 0x98 in position 1040: invalid start byte is raised and the gui is blocked at the home page.

I proposed to modify the _is_perf_file method of fileutil.py file in order to manage this case.

def _is_perf_file(file_path):
    f = get_file(file_path)
    try:
        for line in f:
            if (line[0] == '#'):
                continue
            r = event_regexp.search(line)
            if r:
                f.close()
                return 'perf'
            f.close()
            return 'trace_event'
    except:
        return 'unreadable'


def get_file(file_path):
    # ensure the file is below PROFILE_DIR:
    if not abspath(file_path).startswith(abspath(config.PROFILE_DIR)):
        raise InvalidFileError("File %s is not in PROFILE_DIR" % file_path)
    if not _validpath(file_path):
        raise InvalidFileError("Invalid characters or file %s does not exist." % file_path)
    mime = _get_file_mime(file_path)
    if mime in ['application/x-gzip', 'application/gzip']:
        return gzip.open(file_path, 'rt')
    elif mime == 'text/plain':
        return open(file_path, 'r')
    elif mime == 'application/octet-stream':
        return open(file_path, 'rb')
    else:
        raise InvalidFileError('Unknown mime type.')


@cached(cache=LRUCache(maxsize=1024))
def get_profile_type(file_path):
    mime = _get_file_mime(file_path)
    if mime == 'application/octet-stream':
        return 'nflxprofile'
    elif mime in ['text/plain', 'application/x-gzip', 'application/gzip']:
        return _is_perf_file(file_path)
    else:
        return 'unknown'

and profile_list.py file:

def get_profile_list():
    all_files = []
    for root, dirs, files in walk(join(config.PROFILE_DIR)):
        start = root[len(config.PROFILE_DIR) + 1:]
        print("ERROR: %s" % files)
        for f in files:
            if not f.startswith('.'):
                filename = join(start, f)
                file_path = join(config.PROFILE_DIR, filename)
                file_type = get_profile_type(file_path)
                if(file_type != "unreadable"):
                    all_files.append({
                        'filename': filename,
                        'type': file_type
                    })

    return all_files

With these modifications, the behavior of the home page will be the same as for a file starting by a dot character

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions