summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-13 13:04:37 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-13 13:04:37 -0700
commite037fd7e193ecccbb5c0888e49f6d58c224bc11d (patch)
tree3936f402311799c99169f8e1d6bf168a2d48f1a9
parent2015549667fb77706a9879e974a3875ebccd8198 (diff)
downloadsystem_core-e037fd7e193ecccbb5c0888e49f6d58c224bc11d.zip
system_core-e037fd7e193ecccbb5c0888e49f6d58c224bc11d.tar.gz
system_core-e037fd7e193ecccbb5c0888e49f6d58c224bc11d.tar.bz2
auto import from //branches/cupcake_rel/...@138607
-rw-r--r--adb/adb.c14
-rw-r--r--adb/commandline.c12
-rw-r--r--adb/services.c30
-rw-r--r--init/property_service.c1
-rw-r--r--libcutils/array.c27
-rw-r--r--libcutils/strdup8to16.c5
-rw-r--r--rootdir/init.rc2
-rw-r--r--vold/blkdev.c10
-rw-r--r--vold/media.c4
-rw-r--r--vold/uevent.c12
-rw-r--r--vold/vold.c4
-rw-r--r--vold/volmgr.c28
-rw-r--r--vold/volmgr_vfat.c2
13 files changed, 110 insertions, 41 deletions
diff --git a/adb/adb.c b/adb/adb.c
index 7b23894..12a36f5 100644
--- a/adb/adb.c
+++ b/adb/adb.c
@@ -859,8 +859,20 @@ int adb_main(int is_daemon)
property_get("ro.kernel.qemu", value, "");
if (strcmp(value, "1") != 0) {
property_get("ro.secure", value, "");
- if (strcmp(value, "1") == 0)
+ if (strcmp(value, "1") == 0) {
+ // don't run as root if ro.secure is set...
secure = 1;
+
+ // ... except we allow running as root in userdebug builds if the
+ // service.adb.root property has been set by the "adb root" command
+ property_get("ro.debuggable", value, "");
+ if (strcmp(value, "1") == 0) {
+ property_get("service.adb.root", value, "");
+ if (strcmp(value, "1") == 0) {
+ secure = 0;
+ }
+ }
+ }
}
/* don't listen on port 5037 if we are running in secure mode */
diff --git a/adb/commandline.c b/adb/commandline.c
index be596ce..7410dce 100644
--- a/adb/commandline.c
+++ b/adb/commandline.c
@@ -147,6 +147,7 @@ void help()
" adb get-serialno - prints: <serial-number>\n"
" adb status-window - continuously print device status for a specified device\n"
" adb remount - remounts the /system partition on the device read-write\n"
+ " adb root - restarts adb with root permissions\n"
"\n"
"networking:\n"
" adb ppp <tty> [parameters] - Run PPP over USB.\n"
@@ -914,6 +915,17 @@ top:
return 1;
}
+ if(!strcmp(argv[0], "root")) {
+ int fd = adb_connect("root:");
+ if(fd >= 0) {
+ read_and_dump(fd);
+ adb_close(fd);
+ return 0;
+ }
+ fprintf(stderr,"error: %s\n", adb_error());
+ return 1;
+ }
+
if(!strcmp(argv[0], "bugreport")) {
if (argc != 1) {
return 1;
diff --git a/adb/services.c b/adb/services.c
index e686949..1de55e6 100644
--- a/adb/services.c
+++ b/adb/services.c
@@ -103,6 +103,34 @@ static void recover_service(int s, void *cookie)
adb_close(fd);
}
+void restart_root_service(int fd, void *cookie)
+{
+ char buf[100];
+ char value[PROPERTY_VALUE_MAX];
+
+ if (getuid() == 0) {
+ snprintf(buf, sizeof(buf), "adbd is already running as root\n");
+ writex(fd, buf, strlen(buf));
+ adb_close(fd);
+ } else {
+ property_get("ro.debuggable", value, "");
+ if (strcmp(value, "1") != 0) {
+ snprintf(buf, sizeof(buf), "adbd cannot run as root in production builds\n");
+ writex(fd, buf, strlen(buf));
+ return;
+ }
+
+ property_set("service.adb.root", "1");
+ snprintf(buf, sizeof(buf), "restarting adbd as root\n");
+ writex(fd, buf, strlen(buf));
+ adb_close(fd);
+
+ // quit, and init will restart us as root
+ sleep(1);
+ exit(1);
+ }
+}
+
#endif
#if 0
@@ -289,6 +317,8 @@ int service_to_fd(const char *name)
ret = create_service_thread(file_sync_service, NULL);
} else if(!strncmp(name, "remount:", 8)) {
ret = create_service_thread(remount_service, NULL);
+ } else if(!strncmp(name, "root:", 5)) {
+ ret = create_service_thread(restart_root_service, NULL);
#endif
#if 0
} else if(!strncmp(name, "echo:", 5)){
diff --git a/init/property_service.c b/init/property_service.c
index 7a6416b..0bc6239 100644
--- a/init/property_service.c
+++ b/init/property_service.c
@@ -69,6 +69,7 @@ struct {
{ "dhcp.", AID_DHCP },
{ "debug.", AID_SHELL },
{ "log.", AID_SHELL },
+ { "service.adb.root", AID_SHELL },
{ "persist.sys.", AID_SYSTEM },
{ "persist.service.", AID_SYSTEM },
{ NULL, 0 }
diff --git a/libcutils/array.c b/libcutils/array.c
index ff2c8ff..55ec055 100644
--- a/libcutils/array.c
+++ b/libcutils/array.c
@@ -18,8 +18,10 @@
#include <assert.h>
#include <stdlib.h>
#include <string.h>
+#include <limits.h>
#define INITIAL_CAPACITY (4)
+#define MAX_CAPACITY ((int)(UINT_MAX/sizeof(void*)))
struct Array {
void** contents;
@@ -45,13 +47,26 @@ void arrayFree(Array* array) {
static int ensureCapacity(Array* array, int capacity) {
int oldCapacity = array->capacity;
if (capacity > oldCapacity) {
- int newCapacity = (oldCapacity == 0) ? INITIAL_CAPACITY : oldCapacity * 2;
-
- // Keep doubling capacity until we surpass necessary capacity.
+ int newCapacity = (oldCapacity == 0) ? INITIAL_CAPACITY : oldCapacity;
+
+ // Ensure we're not doing something nasty
+ if (capacity > MAX_CAPACITY)
+ return -1;
+
+ // Keep doubling capacity until we surpass necessary capacity.
while (newCapacity < capacity) {
- newCapacity *= 2;
+ int newCap = newCapacity*2;
+ // Handle integer overflows
+ if (newCap < newCapacity || newCap > MAX_CAPACITY) {
+ newCap = MAX_CAPACITY;
+ }
+ newCapacity = newCap;
}
-
+
+ // Should not happen, but better be safe than sorry
+ if (newCapacity < 0 || newCapacity > MAX_CAPACITY)
+ return -1;
+
void** newContents;
if (array->contents == NULL) {
// Allocate new array.
@@ -151,5 +166,5 @@ int arraySize(Array* array) {
}
const void** arrayUnwrap(Array* array) {
- return array->contents;
+ return (const void**)array->contents;
}
diff --git a/libcutils/strdup8to16.c b/libcutils/strdup8to16.c
index 8654b04..63e5ca4 100644
--- a/libcutils/strdup8to16.c
+++ b/libcutils/strdup8to16.c
@@ -18,6 +18,7 @@
#include <cutils/jstring.h>
#include <assert.h>
#include <stdlib.h>
+#include <limits.h>
/* See http://www.unicode.org/reports/tr22/ for discussion
* on invalid sequences
@@ -48,6 +49,10 @@ extern char16_t * strdup8to16 (const char* s, size_t *out_len)
len = strlen8to16(s);
+ // fail on overflow
+ if (len && SIZE_MAX/len < sizeof(char16_t))
+ return NULL;
+
// no plus-one here. UTF-16 strings are not null terminated
ret = (char16_t *) malloc (sizeof(char16_t) * len);
diff --git a/rootdir/init.rc b/rootdir/init.rc
index e4bb529..a0d6c54 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -116,7 +116,7 @@ on boot
write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15
write /proc/sys/vm/overcommit_memory 1
- write /proc/sys/vm/min_free_order_shift 2
+ write /proc/sys/vm/min_free_order_shift 4
write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144
# Set init its forked children's oom_adj.
diff --git a/vold/blkdev.c b/vold/blkdev.c
index 533bc35..981d0f2 100644
--- a/vold/blkdev.c
+++ b/vold/blkdev.c
@@ -107,8 +107,8 @@ int blkdev_refresh(blkdev_t *blk)
blk->nr_parts = 0;
if ((block[0x1fe] != 0x55) || (block[0x1ff] != 0xAA)) {
- LOG_VOL("Disk %d:%d does not contain a partition table",
- blk->major, blk->minor);
+ LOGI("Disk %d:%d does not contain a partition table",
+ blk->major, blk->minor);
goto out;
}
@@ -120,10 +120,10 @@ int blkdev_refresh(blkdev_t *blk)
struct fat_boot_sector *fb = (struct fat_boot_sector *) &block[0];
if (!i && fb->reserved && fb->fats && fat_valid_media(fb->media)) {
- LOG_VOL("Detected FAT filesystem in partition table");
+ LOGI("Detected FAT filesystem in partition table");
break;
} else {
- LOG_VOL("Partition table looks corrupt");
+ LOGI("Partition table looks corrupt");
break;
}
}
@@ -157,7 +157,7 @@ int blkdev_refresh(blkdev_t *blk)
sprintf(tmp2, " type 0x%x", blk->part_type);
strcat(tmp, tmp2);
- LOG_VOL(tmp);
+ LOGI(tmp);
close(fd);
diff --git a/vold/media.c b/vold/media.c
index 40637ff..db42a3e 100644
--- a/vold/media.c
+++ b/vold/media.c
@@ -114,10 +114,8 @@ int media_add_blkdev(media_t *card, blkdev_t *dev)
{
blkdev_list_t *list_entry;
- if (!(list_entry = malloc(sizeof(blkdev_list_t)))) {
- LOGE("Out of memory");
+ if (!(list_entry = malloc(sizeof(blkdev_list_t))))
return -ENOMEM;
- }
list_entry->next = NULL;
list_entry->dev = dev;
diff --git a/vold/uevent.c b/vold/uevent.c
index b1a6944..d16f315 100644
--- a/vold/uevent.c
+++ b/vold/uevent.c
@@ -248,7 +248,6 @@ static int handle_powersupply_event(struct uevent *event)
low_batt = true;
else
low_batt = false;
-LOG_VOL("handle_powersupply_event(): low_batt = %d, door_open = %d", low_batt, door_open);
volmgr_safe_mode(low_batt || door_open);
}
return 0;
@@ -272,7 +271,6 @@ static int handle_switch_event(struct uevent *event)
door_open = true;
else
door_open = false;
-LOG_VOL("handle_powersupply_event(): low_batt = %d, door_open = %d", low_batt, door_open);
volmgr_safe_mode(low_batt || door_open);
} else
LOG_VOL("handle_switch_event(): Ignoring switch '%s'", name);
@@ -351,7 +349,7 @@ static int handle_block_event(struct uevent *event)
return rc;
}
- LOG_VOL("New blkdev %d.%d on media %s, media path %s, Dpp %d",
+ LOGI("New blkdev %d.%d on media %s, media path %s, Dpp %d",
blkdev->major, blkdev->minor, media->name, mediapath,
blkdev_get_num_pending_partitions(blkdev->disk));
@@ -365,7 +363,7 @@ static int handle_block_event(struct uevent *event)
if (!(blkdev = blkdev_lookup_by_devno(maj, min)))
return 0;
- LOG_VOL("Destroying blkdev %d.%d @ %s on media %s", blkdev->major,
+ LOGI("Destroying blkdev %d.%d @ %s on media %s", blkdev->major,
blkdev->minor, blkdev->devpath, media->name);
volmgr_notify_eject(blkdev, _cb_blkdev_ok_to_destroy);
@@ -373,7 +371,7 @@ static int handle_block_event(struct uevent *event)
if (!(blkdev = blkdev_lookup_by_devno(maj, min)))
return 0;
- LOG_VOL("Modified blkdev %d.%d @ %s on media %s", blkdev->major,
+ LOGI("Modified blkdev %d.%d @ %s on media %s", blkdev->major,
blkdev->minor, blkdev->devpath, media->name);
blkdev_refresh(blkdev);
@@ -420,7 +418,7 @@ static int handle_mmc_event(struct uevent *event)
LOGE("Unable to allocate new media (%m)");
return -1;
}
- LOG_VOL("New MMC card '%s' (serial %u) added @ %s", media->name,
+ LOGI("New MMC card '%s' (serial %u) added @ %s", media->name,
media->serial, media->devpath);
} else if (event->action == action_remove) {
media_t *media;
@@ -430,7 +428,7 @@ static int handle_mmc_event(struct uevent *event)
return -1;
}
- LOG_VOL("MMC card '%s' (serial %u) @ %s removed", media->name,
+ LOGI("MMC card '%s' (serial %u) @ %s removed", media->name,
media->serial, media->devpath);
media_destroy(media);
} else {
diff --git a/vold/vold.c b/vold/vold.c
index 17331ac..7d50a2f 100644
--- a/vold/vold.c
+++ b/vold/vold.c
@@ -60,7 +60,7 @@ int main(int argc, char **argv)
struct sockaddr_nl nladdr;
int uevent_sz = 64 * 1024;
- LOG_VOL("Android Volume Daemon version %d.%d", ver_major, ver_minor);
+ LOGI("Android Volume Daemon version %d.%d", ver_major, ver_minor);
/*
* Create all the various sockets we'll need
@@ -208,7 +208,7 @@ int send_msg(char* message)
pthread_mutex_lock(&write_mutex);
- LOG_VOL("send_msg(%s):", message);
+// LOG_VOL("send_msg(%s):", message);
if (fw_sock >= 0)
result = write(fw_sock, message, strlen(message) + 1);
diff --git a/vold/volmgr.c b/vold/volmgr.c
index c3ce8d1..7c4c077 100644
--- a/vold/volmgr.c
+++ b/vold/volmgr.c
@@ -205,7 +205,7 @@ int volmgr_bootstrap(void)
volume_t *v = vol_root;
while (v) {
if (_mountpoint_mounted(v->mount_point)) {
- LOG_VOL("Volume '%s' already mounted at startup", v->mount_point);
+ LOGW("Volume '%s' already mounted at startup", v->mount_point);
v->state = volstate_mounted;
}
v = v->next;
@@ -229,7 +229,7 @@ int volmgr_safe_mode(boolean enable)
if (v->state == volstate_mounted && v->fs) {
rc = v->fs->mount_fn(v->dev, v, safe_mode);
if (!rc) {
- LOG_VOL("Safe mode %s on %s", (enable ? "enabled" : "disabled"), v->mount_point);
+ LOGI("Safe mode %s on %s", (enable ? "enabled" : "disabled"), v->mount_point);
} else {
LOGE("Failed to %s safe-mode on %s (%s)",
(enable ? "enable" : "disable" ), v->mount_point, strerror(-rc));
@@ -555,7 +555,7 @@ static int _volmgr_consider_disk_and_vol(volume_t *vol, blkdev_t *dev)
}
- LOG_VOL("Evaluating dev '%s' for mountable filesystems for '%s'",
+ LOGI("Evaluating dev '%s' for mountable filesystems for '%s'",
dev->devpath, vol->mount_point);
if (dev->nr_parts == 0) {
@@ -642,7 +642,7 @@ static void *volmgr_reaper_thread(void *arg)
actions.sa_handler = volmgr_reaper_thread_sighandler;
sigaction(SIGUSR1, &actions, NULL);
- LOG_VOL("Reaper here - working on %s", vol->mount_point);
+ LOGW("Reaper here - working on %s", vol->mount_point);
boolean send_sig_kill = false;
int i, rc;
@@ -650,7 +650,7 @@ static void *volmgr_reaper_thread(void *arg)
for (i = 0; i < 10; i++) {
errno = 0;
rc = umount(vol->mount_point);
- LOG_VOL("volmngr reaper umount(%s) attempt %d (%s)",
+ LOGW("volmngr reaper umount(%s) attempt %d (%s)",
vol->mount_point, i + 1, strerror(errno));
if (!rc)
break;
@@ -667,7 +667,7 @@ static void *volmgr_reaper_thread(void *arg)
}
if (!rc) {
- LOG_VOL("Reaper sucessfully unmounted %s", vol->mount_point);
+ LOGI("Reaper sucessfully unmounted %s", vol->mount_point);
vol->fs = NULL;
volume_setstate(vol, volstate_unmounted);
} else {
@@ -687,7 +687,7 @@ static void volmgr_uncage_reaper(volume_t *vol, void (* cb) (volume_t *, void *a
if (vol->worker_running) {
LOGE("Worker thread is currently running.. waiting..");
pthread_mutex_lock(&vol->worker_sem);
- LOG_VOL("Worker thread now available");
+ LOGI("Worker thread now available");
}
vol->worker_args.reaper_args.cb = cb;
@@ -716,7 +716,7 @@ static int volmgr_stop_volume(volume_t *v, void (*cb) (volume_t *, void *), void
break;
}
- LOG_VOL("volmngr quick stop umount(%s) attempt %d (%s)",
+ LOGI("volmngr quick stop umount(%s) attempt %d (%s)",
v->mount_point, i + 1, strerror(errno));
if (i == 0)
@@ -726,7 +726,7 @@ static int volmgr_stop_volume(volume_t *v, void (*cb) (volume_t *, void *), void
}
if (!rc) {
- LOG_VOL("volmgr_stop_volume(%s): Volume unmounted sucessfully",
+ LOGI("volmgr_stop_volume(%s): Volume unmounted sucessfully",
v->mount_point);
if (emit_statechange)
volume_setstate(v, volstate_unmounted);
@@ -738,7 +738,7 @@ static int volmgr_stop_volume(volume_t *v, void (*cb) (volume_t *, void *), void
* Since the volume is still in use, dispatch the stopping to
* a thread
*/
- LOG_VOL("Volume %s is busy (%d) - uncaging the reaper", v->mount_point, rc);
+ LOGW("Volume %s is busy (%d) - uncaging the reaper", v->mount_point, rc);
volmgr_uncage_reaper(v, cb, arg);
return -EINPROGRESS;
} else if (v->state == volstate_checking) {
@@ -1061,7 +1061,7 @@ static int volmgr_start_fs(struct volmgr_fstable_entry *fs, volume_t *vol, blkde
if (vol->worker_running) {
LOGE("Worker thread is currently running.. waiting..");
pthread_mutex_lock(&vol->worker_sem);
- LOG_VOL("Worker thread now available");
+ LOGI("Worker thread now available");
}
vol->dev = dev;
@@ -1132,7 +1132,7 @@ static void *volmgr_start_fs_thread(void *arg)
rc = fs->check_fn(dev);
pthread_mutex_lock(&vol->lock);
if (vol->state != volstate_checking) {
- LOG_VOL("filesystem check aborted");
+ LOGE("filesystem check aborted");
goto out;
}
@@ -1146,14 +1146,14 @@ static void *volmgr_start_fs_thread(void *arg)
goto out_unmountable;
}
#if DEBUG_VOLMGR
- LOG_VOL("%s filesystem check of %d:%d OK", fs->name,
+ LOGI("%s filesystem check of %d:%d OK", fs->name,
dev->major, dev->minor);
#endif
}
rc = fs->mount_fn(dev, vol, safe_mode);
if (!rc) {
- LOG_VOL("Sucessfully mounted %s filesystem %d:%d on %s (safe-mode %s)",
+ LOGI("Sucessfully mounted %s filesystem %d:%d on %s (safe-mode %s)",
fs->name, dev->major, dev->minor, vol->mount_point,
(safe_mode ? "on" : "off"));
vol->fs = fs;
diff --git a/vold/volmgr_vfat.c b/vold/volmgr_vfat.c
index b08e6a5..344a166 100644
--- a/vold/volmgr_vfat.c
+++ b/vold/volmgr_vfat.c
@@ -107,8 +107,6 @@ int vfat_mount(blkdev_t *dev, volume_t *vol, boolean safe_mode)
flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC;
- if (safe_mode)
- flags |= MS_SYNCHRONOUS;
if (vol->state == volstate_mounted) {
LOG_VOL("Remounting %d:%d on %s, safe mode %d", dev->major,
dev->minor, vol->mount_point, safe_mode);