1
0
Fork 0

init commit: aosp-16.0_r3

This commit is contained in:
dvab-sarma 2025-11-28 20:07:52 -06:00
parent f987ba35af
commit d46f45b365
15 changed files with 92 additions and 279 deletions

View file

@ -1,3 +0,0 @@
#!/usr/bin/env bash
make

View file

@ -1,126 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
# push:
# branches: [ "main", "master" ]
schedule:
- cron: '0 0 * * *'
pull_request:
branches: '*'
jobs:
analyze:
name: Analyze
# Runner size impacts CodeQL analysis time. To learn more, please see:
# - https://gh.io/recommended-hardware-resources-for-running-codeql
# - https://gh.io/supported-runners-and-hardware-resources
# - https://gh.io/using-larger-runners
# Consider using larger runners for possible analysis time improvements.
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-20.04' }}
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'cpp' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ]
# Use only 'java' to analyze code written in Java, Kotlin or both
# Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: recursive
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
queries: security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).
# If this step fails, then you should remove it and run the build manually (see below)
#- name: Autobuild
# uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
- run: |
./.github/workflows/codeql-buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{matrix.language}}"
upload: false
id: step1
# Filter out rules with low severity or high false positve rate
# Also filter out warnings in third-party code
- name: Filter out unwanted errors and warnings
uses: advanced-security/filter-sarif@v1
with:
patterns: |
-**:cpp/path-injection
-**:cpp/world-writable-file-creation
-**:cpp/poorly-documented-function
-**:cpp/potentially-dangerous-function
-**:cpp/use-of-goto
-**:cpp/integer-multiplication-cast-to-long
-**:cpp/comparison-with-wider-type
-**:cpp/leap-year/*
-**:cpp/ambiguously-signed-bit-field
-**:cpp/suspicious-pointer-scaling
-**:cpp/suspicious-pointer-scaling-void
-**:cpp/unsigned-comparison-zero
-**/cmake*/Modules/**
input: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif
output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif
- name: Upload CodeQL results to code scanning
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: ${{ steps.step1.outputs.sarif-output }}
category: "/language:${{matrix.language}}"
- name: Upload CodeQL results as an artifact
if: success() || failure()
uses: actions/upload-artifact@v3
with:
name: codeql-results
path: ${{ steps.step1.outputs.sarif-output }}
retention-days: 5
- name: Fail if an error is found
run: |
./.github/workflows/fail_on_error.py \
${{ steps.step1.outputs.sarif-output }}/cpp.sarif

View file

@ -1,34 +0,0 @@
#!/usr/bin/env python3
import json
import sys
# Return whether SARIF file contains error-level results
def codeql_sarif_contain_error(filename):
with open(filename, 'r') as f:
s = json.load(f)
for run in s.get('runs', []):
rules_metadata = run['tool']['driver']['rules']
if not rules_metadata:
rules_metadata = run['tool']['extensions'][0]['rules']
for res in run.get('results', []):
if 'ruleIndex' in res:
rule_index = res['ruleIndex']
elif 'rule' in res and 'index' in res['rule']:
rule_index = res['rule']['index']
else:
continue
try:
rule_level = rules_metadata[rule_index]['defaultConfiguration']['level']
except IndexError as e:
print(e, rule_index, len(rules_metadata))
else:
if rule_level == 'error':
return True
return False
if __name__ == "__main__":
if codeql_sarif_contain_error(sys.argv[1]):
sys.exit(1)

5
.gitignore vendored
View file

@ -1,5 +0,0 @@
*.o
*.a
*.so
*.so.*
*.pc

View file

@ -1,52 +1,17 @@
package {
default_applicable_licenses: ["external_libudev_zero_license"],
}
license {
name: "external_libudev_zero_license",
visibility: [":__subpackages__"],
license_kinds: [
"SPDX-license-identifier-ISC",
],
license_text: [
"LICENSE",
],
}
cc_genrule {
name: "libudev_zero_copy_headers",
srcs: ["udev.h"],
out: ["libudev.h"],
cmd: "cp $(in) $(out)",
}
cc_library { cc_library {
name: "libudev-zero", name: "libudev",
vendor_available: true, vendor_available: true,
visibility: [ export_include_dirs: ["."],
"//external/ffmpeg/libavcodec",
"//external/igt-gpu-tools",
"//external/v4l-utils/utils/media-ctl",
],
srcs: [ srcs: [
"udev.c", "udev.c",
"udev_list.c",
"udev_device.c", "udev_device.c",
"udev_monitor.c",
"udev_enumerate.c", "udev_enumerate.c",
"udev_list.c",
"udev_monitor.c"
], ],
generated_headers: [
"libudev_zero_copy_headers",
],
export_generated_headers: [
"libudev_zero_copy_headers",
],
cflags: [ cflags: [
"-Wall",
"-Wextra",
"-Wpedantic",
"-Wmissing-prototypes",
"-Wstrict-prototypes",
"-Wno-unused-parameter", "-Wno-unused-parameter",
], ],
} }

View file

@ -1,16 +0,0 @@
name: "libudev-zero"
description:
"Drop-in replacement for libudev intended to work with any device manager"
third_party {
homepage: "https://github.com/illiliti/libudev-zero"
identifier {
type: "Git"
value: "https://github.com/illiliti/libudev-zero"
primary_source: true
version: "bbeb7ad51c1edb7ab3cf63f30a21e9bb383b7994"
}
version: "bbeb7ad51c1edb7ab3cf63f30a21e9bb383b7994"
last_upgrade_date { year: 2025 month: 4 day: 28 }
license_type: NOTICE
}

View file

View file

@ -5,7 +5,7 @@ PREFIX = /usr/local
LIBDIR = ${PREFIX}/lib LIBDIR = ${PREFIX}/lib
INCLUDEDIR = ${PREFIX}/include INCLUDEDIR = ${PREFIX}/include
PKGCONFIGDIR = ${LIBDIR}/pkgconfig PKGCONFIGDIR = ${LIBDIR}/pkgconfig
XCFLAGS = ${CPPFLAGS} ${CFLAGS} -std=c99 -fPIC -D_XOPEN_SOURCE=700 \ XCFLAGS = ${CPPFLAGS} ${CFLAGS} -std=c99 -fPIC -pthread -D_XOPEN_SOURCE=700 \
-Wall -Wextra -Wpedantic -Wmissing-prototypes -Wstrict-prototypes \ -Wall -Wextra -Wpedantic -Wmissing-prototypes -Wstrict-prototypes \
-Wno-unused-parameter -Wno-unused-parameter
XLDFLAGS = ${LDFLAGS} -shared -Wl,-soname,libudev.so.1 XLDFLAGS = ${LDFLAGS} -shared -Wl,-soname,libudev.so.1
@ -43,7 +43,7 @@ libudev.pc: libudev.pc.in
-e 's|@exec_prefix@|${PREFIX}|g' \ -e 's|@exec_prefix@|${PREFIX}|g' \
-e "s|@libdir@|$$libdir|g" \ -e "s|@libdir@|$$libdir|g" \
-e "s|@includedir@|$$includedir|g" \ -e "s|@includedir@|$$includedir|g" \
-e 's|@VERSION@|251|g' \ -e 's|@VERSION@|243|g' \
libudev.pc.in > libudev.pc libudev.pc.in > libudev.pc
install-headers: udev.h install-headers: udev.h

1
OWNERS
View file

@ -1 +0,0 @@
include platform/system/core:main:/janitors/OWNERS

View file

@ -46,7 +46,7 @@ Keep in mind that libudev-zero isn't ideal. Here are some pros/cons:
* android-tools - requires udev rules for non-root usage * android-tools - requires udev rules for non-root usage
* NetworkManager - needs investigation * NetworkManager - needs investigation
* libgudev - needs investigation * libgudev - needs investigation
* PipeWire - depends on udev internal properties. [patch](https://github.com/illiliti/libudev-zero/issues/26#issuecomment-1848802791) * PipeWire - depends on udev internal properties. [patch](https://github.com/illiliti/libudev-zero/issues/26#issuecomment-846858706)
* ldm - depends on udev internal properties * ldm - depends on udev internal properties
* lvm2 - uses deprecated `udev_queue` API * lvm2 - uses deprecated `udev_queue` API
* cups - needs investigation * cups - needs investigation

1
libudev.h Symbolic link
View file

@ -0,0 +1 @@
udev.h

View file

@ -9,4 +9,5 @@ Description: Daemonless replacement for libudev
Version: @VERSION@ Version: @VERSION@
URL: https://github.com/illiliti/libudev-zero URL: https://github.com/illiliti/libudev-zero
Libs: -L${libdir} -ludev Libs: -L${libdir} -ludev
Libs.private: -pthread
Cflags: -I${includedir} Cflags: -I${includedir}

1
udev.h
View file

@ -70,7 +70,6 @@ int udev_device_has_tag(struct udev_device *udev_device, const char *tag);
struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *udev_device); struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *udev_device);
struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device); struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device);
struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device); struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device);
struct udev_list_entry *udev_device_get_current_tags_list_entry(struct udev_device *udev_device);
struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device); struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device);
const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key); const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key);
const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr); const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr);

View file

@ -228,11 +228,6 @@ struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device
return NULL; return NULL;
} }
/* XXX NOT IMPLEMENTED */ struct udev_list_entry *udev_device_get_current_tags_list_entry(struct udev_device *udev_device)
{
return NULL;
}
struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device) struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device)
{ {
return udev_device ? udev_list_entry_get_next(&udev_device->sysattrs) : NULL; return udev_device ? udev_list_entry_get_next(&udev_device->sysattrs) : NULL;
@ -267,14 +262,13 @@ const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const
snprintf(path, sizeof(path), "%s/%s", udev_device_get_syspath(udev_device), sysattr); snprintf(path, sizeof(path), "%s/%s", udev_device_get_syspath(udev_device), sysattr);
file = fopen(path, "r"); if (lstat(path, &st) != 0 || !S_ISREG(st.st_mode)) {
if (!file) {
return NULL; return NULL;
} }
if (fstat(fileno(file), &st) != 0 || !S_ISREG(st.st_mode)) { file = fopen(path, "r");
fclose(file);
if (!file) {
return NULL; return NULL;
} }
@ -310,14 +304,13 @@ int udev_device_set_sysattr_value(struct udev_device *udev_device, const char *s
snprintf(path, sizeof(path), "%s/%s", udev_device_get_syspath(udev_device), sysattr); snprintf(path, sizeof(path), "%s/%s", udev_device_get_syspath(udev_device), sysattr);
file = fopen(path, "w"); if (lstat(path, &st) != 0 || !S_ISREG(st.st_mode)) {
if (!file) {
return -1; return -1;
} }
if (fstat(fileno(file), &st) != 0 || !S_ISREG(st.st_mode)) { file = fopen(path, "w");
fclose(file);
if (!file) {
return -1; return -1;
} }
@ -349,17 +342,17 @@ static char *read_symlink(const char *syspath, const char *name)
return strdup(strrchr(link, '/') + 1); return strdup(strrchr(link, '/') + 1);
} }
static int set_properties_from_uevent(struct udev_device *udev_device, const char *syspath) static void set_properties_from_uevent(struct udev_device *udev_device)
{ {
char line[LINE_MAX], path[PATH_MAX + sizeof("/uevent")], devnode[PATH_MAX]; char line[LINE_MAX], path[PATH_MAX], devnode[PATH_MAX];
FILE *file; FILE *file;
char *pos; char *pos;
snprintf(path, sizeof(path), "%s/uevent", syspath); snprintf(path, sizeof(path), "%s/uevent", udev_device_get_syspath(udev_device));
file = fopen(path, "r"); file = fopen(path, "r");
if (!file) { if (!file) {
return -1; return;
} }
while (fgets(line, sizeof(line), file)) { while (fgets(line, sizeof(line), file)) {
@ -371,12 +364,11 @@ static int set_properties_from_uevent(struct udev_device *udev_device, const cha
} }
else if ((pos = strchr(line, '='))) { else if ((pos = strchr(line, '='))) {
*pos = '\0'; *pos = '\0';
udev_list_entry_add(&udev_device->properties, line, pos + 1, 0); udev_list_entry_add(&udev_device->properties, line, pos + 1, 1);
} }
} }
fclose(file); fclose(file);
return 0;
} }
static void make_bit(unsigned long *arr, int cnt, const char *str) static void make_bit(unsigned long *arr, int cnt, const char *str)
@ -458,7 +450,13 @@ static void set_properties_from_evdev(struct udev_device *udev_device)
udev_list_entry_add(&udev_device->properties, "ID_INPUT_SWITCH", "1", 0); udev_list_entry_add(&udev_device->properties, "ID_INPUT_SWITCH", "1", 0);
} }
if (test_bit(ev_bits, EV_ABS)) { if (test_bit(ev_bits, EV_REL)) {
if (test_bit(rel_bits, REL_Y) && test_bit(rel_bits, REL_X) &&
test_bit(key_bits, BTN_MOUSE)) {
udev_list_entry_add(&udev_device->properties, "ID_INPUT_MOUSE", "1", 0);
}
}
else if (test_bit(ev_bits, EV_ABS)) {
if (test_bit(key_bits, BTN_SELECT) || test_bit(key_bits, BTN_TR) || if (test_bit(key_bits, BTN_SELECT) || test_bit(key_bits, BTN_TR) ||
test_bit(key_bits, BTN_START) || test_bit(key_bits, BTN_TL)) { test_bit(key_bits, BTN_START) || test_bit(key_bits, BTN_TL)) {
if (test_bit(key_bits, BTN_TOUCH)) { if (test_bit(key_bits, BTN_TOUCH)) {
@ -488,12 +486,6 @@ static void set_properties_from_evdev(struct udev_device *udev_device)
} }
} }
} }
else if (test_bit(ev_bits, EV_REL)) {
if (test_bit(rel_bits, REL_Y) && test_bit(rel_bits, REL_X) &&
test_bit(key_bits, BTN_MOUSE)) {
udev_list_entry_add(&udev_device->properties, "ID_INPUT_MOUSE", "1", 0);
}
}
if (!test_bit(ev_bits, EV_KEY)) { if (!test_bit(ev_bits, EV_KEY)) {
return; return;
@ -551,13 +543,21 @@ struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *
return NULL; return NULL;
} }
subsystem = read_symlink(syspath, "subsystem");
if (!subsystem) {
return NULL;
}
if (!realpath(syspath, path)) { if (!realpath(syspath, path)) {
free(subsystem);
return NULL; return NULL;
} }
udev_device = calloc(1, sizeof(*udev_device)); udev_device = calloc(1, sizeof(*udev_device));
if (!udev_device) { if (!udev_device) {
free(subsystem);
return NULL; return NULL;
} }
@ -568,17 +568,11 @@ struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *
udev_list_entry_init(&udev_device->properties); udev_list_entry_init(&udev_device->properties);
udev_list_entry_init(&udev_device->sysattrs); udev_list_entry_init(&udev_device->sysattrs);
if (set_properties_from_uevent(udev_device, path) == -1) {
free(udev_device);
return NULL;
}
udev_list_entry_add(&udev_device->properties, "SYSPATH", path, 0); udev_list_entry_add(&udev_device->properties, "SYSPATH", path, 0);
udev_list_entry_add(&udev_device->properties, "DEVPATH", path + 4, 0); udev_list_entry_add(&udev_device->properties, "DEVPATH", path + 4, 0);
sysname = strrchr(path, '/') + 1; sysname = strrchr(path, '/') + 1;
driver = read_symlink(path, "driver"); driver = read_symlink(path, "driver");
subsystem = read_symlink(path, "subsystem");
udev_list_entry_add(&udev_device->properties, "SUBSYSTEM", subsystem, 0); udev_list_entry_add(&udev_device->properties, "SUBSYSTEM", subsystem, 0);
udev_list_entry_add(&udev_device->properties, "SYSNAME", sysname, 0); udev_list_entry_add(&udev_device->properties, "SYSNAME", sysname, 0);
@ -591,6 +585,7 @@ struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *
} }
} }
set_properties_from_uevent(udev_device);
set_properties_from_evdev(udev_device); set_properties_from_evdev(udev_device);
set_properties_from_props(udev_device); set_properties_from_props(udev_device);

View file

@ -21,6 +21,7 @@
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#include <fnmatch.h> #include <fnmatch.h>
#include <pthread.h>
#include "udev.h" #include "udev.h"
#include "udev_list.h" #include "udev_list.h"
@ -37,6 +38,13 @@ struct udev_enumerate {
int refcount; int refcount;
}; };
struct udev_enumerate_thread {
struct udev_enumerate *udev_enumerate;
pthread_mutex_t *mutex;
char path[PATH_MAX];
pthread_t thread;
};
int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem) int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem)
{ {
return udev_enumerate ? !!udev_list_entry_add(&udev_enumerate->subsystem_match, subsystem, NULL, 0) - 1 : -1; return udev_enumerate ? !!udev_list_entry_add(&udev_enumerate->subsystem_match, subsystem, NULL, 0) - 1 : -1;
@ -223,27 +231,31 @@ static int filter_sysattr(struct udev_enumerate *udev_enumerate, struct udev_dev
return 1; return 1;
} }
static void add_device(struct udev_enumerate *udev_enumerate, const char *path) static void *add_device(void *ptr)
{ {
struct udev_enumerate_thread *thread = ptr;
struct udev_device *udev_device; struct udev_device *udev_device;
udev_device = udev_device_new_from_syspath(udev_enumerate->udev, path); udev_device = udev_device_new_from_syspath(thread->udev_enumerate->udev, thread->path);
if (!udev_device) { if (!udev_device) {
return; return NULL;
} }
if (!filter_subsystem(udev_enumerate, udev_device) || if (!filter_subsystem(thread->udev_enumerate, udev_device) ||
!filter_sysname(udev_enumerate, udev_device) || !filter_sysname(thread->udev_enumerate, udev_device) ||
!filter_property(udev_enumerate, udev_device) || !filter_property(thread->udev_enumerate, udev_device) ||
!filter_sysattr(udev_enumerate, udev_device)) { !filter_sysattr(thread->udev_enumerate, udev_device)) {
udev_device_unref(udev_device); udev_device_unref(udev_device);
return; return NULL;
} }
udev_list_entry_add(&udev_enumerate->devices, udev_device_get_syspath(udev_device), NULL, 0); pthread_mutex_lock(thread->mutex);
udev_list_entry_add(&thread->udev_enumerate->devices, udev_device_get_syspath(udev_device), NULL, 0);
pthread_mutex_unlock(thread->mutex);
udev_device_unref(udev_device); udev_device_unref(udev_device);
return NULL;
} }
static int filter_dot(const struct dirent *de) static int filter_dot(const struct dirent *de)
@ -253,7 +265,9 @@ static int filter_dot(const struct dirent *de)
static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path) static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path)
{ {
int i, cnt; struct udev_enumerate_thread *thread;
pthread_mutex_t mutex;
int i, cnt, ret = 1;
struct dirent **de; struct dirent **de;
cnt = scandir(path, &de, filter_dot, NULL); cnt = scandir(path, &de, filter_dot, NULL);
@ -262,18 +276,41 @@ static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path)
return 0; return 0;
} }
for (i = 0; i < cnt; i++) { thread = calloc(cnt, sizeof(*thread));
char device_path[PATH_MAX];
snprintf(device_path, sizeof(device_path), "%s/%s", path, de[i]->d_name); if (!thread) {
add_device(udev_enumerate, device_path); ret = 0;
goto free_de;
} }
pthread_mutex_init(&mutex, NULL);
for (i = 0; i < cnt; i++) {
thread[i].mutex = &mutex;
thread[i].udev_enumerate = udev_enumerate;
snprintf(thread[i].path, sizeof(thread[i].path), "%s/%s", path, de[i]->d_name);
if (pthread_create(&thread[i].thread, NULL, add_device, &thread[i]) != 0) {
ret = 0;
break;
}
}
for (i = 0; i < cnt; i++) {
pthread_join(thread[i].thread, NULL);
}
free(thread);
pthread_mutex_destroy(&mutex);
free_de:
for (i = 0; i < cnt; i++) { for (i = 0; i < cnt; i++) {
free(de[i]); free(de[i]);
} }
free(de); free(de);
return 1; return ret;
} }
int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate) int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)