From d0648cfe4fbb415a9552557cbb785d05353b1739 Mon Sep 17 00:00:00 2001 From: Michael Biebl Date: Sat, 18 Apr 2020 20:24:24 +0200 Subject: [PATCH] New upstream version 245.5 --- catalog/systemd.catalog.in | 23 + docs/USER_RECORD.md | 3 +- hwdb.d/20-bluetooth-vendor-product.hwdb | 3691 +++++++++++++++++++++- man/coredumpctl.xml | 11 + man/homectl.xml | 5 +- man/journalctl.xml | 13 +- man/systemd-run.xml | 6 +- man/systemd.exec.xml | 15 +- man/systemd.service.xml | 8 +- man/systemd.unit.xml | 2 +- man/sysusers.d.xml | 3 + src/analyze/analyze-verify.c | 5 +- src/analyze/analyze-verify.h | 2 + src/analyze/test-verify.c | 19 + src/basic/capability-util.c | 8 +- src/basic/fileio.c | 48 +- src/basic/fileio.h | 4 +- src/basic/string-util.c | 5 +- src/basic/terminal-util.c | 32 +- src/basic/user-util.c | 182 +- src/basic/user-util.h | 21 +- src/basic/virt.c | 13 +- src/core/dbus-execute.c | 7 +- src/core/dbus-manager.c | 2 +- src/core/dbus-socket.c | 4 +- src/core/dbus-util.c | 7 +- src/core/dbus-util.h | 2 +- src/core/dynamic-user.c | 2 +- src/core/execute.c | 60 +- src/core/load-fragment.c | 4 +- src/core/unit.c | 2 +- src/coredump/coredumpctl.c | 18 + src/home/home-util.c | 2 +- src/home/homectl.c | 6 +- src/home/homed-manager-bus.c | 6 +- src/home/pam_systemd_home.c | 7 +- src/journal-remote/journal-remote-main.c | 2 +- src/libsystemd/sd-hwdb/hwdb-util.c | 2 +- src/login/logind-dbus.c | 7 + src/network/netdev/fou-tunnel.c | 26 +- src/nss-systemd/nss-systemd.c | 6 +- src/resolve/resolved-etc-hosts.c | 9 +- src/resolve/resolved-manager.c | 2 + src/resolve/resolved-manager.h | 2 + src/resolve/resolved-resolv-conf.c | 42 +- src/shared/conf-parser.c | 6 +- src/shared/dissect-image.c | 4 + src/shared/group-record.c | 10 +- src/shared/json.c | 2 +- src/shared/json.h | 1 + src/shared/sleep-config.c | 2 +- src/shared/user-record.c | 8 +- src/shared/userdb.c | 8 +- src/systemd/sd-messages.h | 3 + src/sysusers/sysusers.c | 6 +- src/test/meson.build | 4 + src/test/test-strv.c | 6 + src/test/test-user-util.c | 255 +- src/udev/net/link-config.c | 2 +- src/userdb/userdbctl.c | 11 +- test/TEST-47-ISSUE-14566/testsuite.sh | 1 + 61 files changed, 4247 insertions(+), 428 deletions(-) create mode 100644 src/analyze/test-verify.c diff --git a/catalog/systemd.catalog.in b/catalog/systemd.catalog.in index db275d7c5..3342d5942 100644 --- a/catalog/systemd.catalog.in +++ b/catalog/systemd.catalog.in @@ -412,3 +412,26 @@ as the best process to terminate and has been forcibly terminated by the kernel. Note that the memory pressure might or might not have been caused by @UNIT@. + +-- b61fdac612e94b9182285b998843061f +Subject: Accepting user/group name @USER_GROUP_NAME@, which does not match strict user/group name rules. +Defined-By: systemd +Support: %SUPPORT_URL% + +The user/group name @USER_GROUP_NAME@ has been specified, which is accepted +according the relaxed user/group name rules, but does not qualify under the +strict rules. + +The strict user/group name rules written as regular expression are: + +^[a-zA-Z_][a-zA-Z0-9_-]{0,30}$ + +The relaxed user/group name rules accept all names, except for the empty +string; names containing NUL bytes, control characters, colon or slash +characters; names not valid UTF-8; names with leading or trailing whitespace; +the strings "." or ".."; fully numeric strings, or strings beginning in a +hyphen and otherwise fully numeric. + +For further details on strict and relaxed user/group name rules, see: + +https://systemd.io/USER_NAMES diff --git a/docs/USER_RECORD.md b/docs/USER_RECORD.md index 299aaade4..448631bc8 100644 --- a/docs/USER_RECORD.md +++ b/docs/USER_RECORD.md @@ -205,7 +205,8 @@ object. The following fields are currently defined: UNIX user name. This field is the only mandatory field, all others are optional. Corresponds with the `pw_name` field of of `struct passwd` and the `sp_namp` field of `struct spwd` (i.e. the shadow user record stored in -`/etc/shadow`). +`/etc/shadow`). See [User/Group Name Syntax](https://systemd.io/USER_NAMES) for +the (relaxed) rules the various systemd components enforce on user/group names. `realm` → The "realm" a user is defined in. This concept allows distinguishing users with the same name that originate in different organizations or diff --git a/hwdb.d/20-bluetooth-vendor-product.hwdb b/hwdb.d/20-bluetooth-vendor-product.hwdb index 9cba3bfc0..1d92f57ec 100644 --- a/hwdb.d/20-bluetooth-vendor-product.hwdb +++ b/hwdb.d/20-bluetooth-vendor-product.hwdb @@ -46,7 +46,7 @@ bluetooth:v000D* ID_VENDOR_FROM_DATABASE=Texas Instruments Inc. bluetooth:v000E* - ID_VENDOR_FROM_DATABASE=Ceva, Inc. (formerly Parthus Technologies, Inc.) + ID_VENDOR_FROM_DATABASE=Parthus Technologies Inc. bluetooth:v000F* ID_VENDOR_FROM_DATABASE=Broadcom Corporation @@ -55,7 +55,7 @@ bluetooth:v0010* ID_VENDOR_FROM_DATABASE=Mitel Semiconductor bluetooth:v0011* - ID_VENDOR_FROM_DATABASE=Widcomm, Inc + ID_VENDOR_FROM_DATABASE=Widcomm, Inc. bluetooth:v0012* ID_VENDOR_FROM_DATABASE=Zeevo, Inc. @@ -73,7 +73,7 @@ bluetooth:v0016* ID_VENDOR_FROM_DATABASE=KC Technology Inc. bluetooth:v0017* - ID_VENDOR_FROM_DATABASE=NewLogic + ID_VENDOR_FROM_DATABASE=Newlogic bluetooth:v0018* ID_VENDOR_FROM_DATABASE=Transilica, Inc. @@ -172,13 +172,13 @@ bluetooth:v0037* ID_VENDOR_FROM_DATABASE=Mobilian Corporation bluetooth:v0038* - ID_VENDOR_FROM_DATABASE=Terax + ID_VENDOR_FROM_DATABASE=Syntronix Corporation bluetooth:v0039* ID_VENDOR_FROM_DATABASE=Integrated System Solution Corp. bluetooth:v003A* - ID_VENDOR_FROM_DATABASE=Matsushita Electric Industrial Co., Ltd. + ID_VENDOR_FROM_DATABASE=Panasonic Corporation (formerly Matsushita Electric Industrial Co., Ltd.) bluetooth:v003B* ID_VENDOR_FROM_DATABASE=Gennum Corporation @@ -190,10 +190,10 @@ bluetooth:v003D* ID_VENDOR_FROM_DATABASE=IPextreme, Inc. bluetooth:v003E* - ID_VENDOR_FROM_DATABASE=Systems and Chips, Inc. + ID_VENDOR_FROM_DATABASE=Systems and Chips, Inc bluetooth:v003F* - ID_VENDOR_FROM_DATABASE=Bluetooth SIG, Inc. + ID_VENDOR_FROM_DATABASE=Bluetooth SIG, Inc bluetooth:v0040* ID_VENDOR_FROM_DATABASE=Seiko Epson Corporation @@ -205,7 +205,7 @@ bluetooth:v0042* ID_VENDOR_FROM_DATABASE=CONWISE Technology Corporation Ltd bluetooth:v0043* - ID_VENDOR_FROM_DATABASE=PARROT SA + ID_VENDOR_FROM_DATABASE=PARROT AUTOMOTIVE SAS bluetooth:v0044* ID_VENDOR_FROM_DATABASE=Socket Mobile @@ -241,10 +241,10 @@ bluetooth:v004E* ID_VENDOR_FROM_DATABASE=Avago Technologies bluetooth:v004F* - ID_VENDOR_FROM_DATABASE=APT Licensing Ltd. + ID_VENDOR_FROM_DATABASE=APT Ltd. bluetooth:v0050* - ID_VENDOR_FROM_DATABASE=SiRF Technology + ID_VENDOR_FROM_DATABASE=SiRF Technology, Inc. bluetooth:v0051* ID_VENDOR_FROM_DATABASE=Tzero Technologies, Inc. @@ -331,7 +331,7 @@ bluetooth:v006C* ID_VENDOR_FROM_DATABASE=Beautiful Enterprise Co., Ltd. bluetooth:v006D* - ID_VENDOR_FROM_DATABASE=BriarTek, Inc. + ID_VENDOR_FROM_DATABASE=BriarTek, Inc bluetooth:v006E* ID_VENDOR_FROM_DATABASE=Summit Data Communications, Inc. @@ -382,7 +382,7 @@ bluetooth:v007C* ID_VENDOR_FROM_DATABASE=A & R Cambridge bluetooth:v007D* - ID_VENDOR_FROM_DATABASE=Seers Technology Co. Ltd + ID_VENDOR_FROM_DATABASE=Seers Technology Co., Ltd. bluetooth:v007E* ID_VENDOR_FROM_DATABASE=Sports Tracking Technologies Ltd. @@ -409,7 +409,7 @@ bluetooth:v0085* ID_VENDOR_FROM_DATABASE=BlueRadios, Inc. bluetooth:v0086* - ID_VENDOR_FROM_DATABASE=equinox AG + ID_VENDOR_FROM_DATABASE=Equinux AG bluetooth:v0087* ID_VENDOR_FROM_DATABASE=Garmin International, Inc. @@ -433,16 +433,16 @@ bluetooth:v008D* ID_VENDOR_FROM_DATABASE=Zscan Software bluetooth:v008E* - ID_VENDOR_FROM_DATABASE=Quintic Corp. + ID_VENDOR_FROM_DATABASE=Quintic Corp bluetooth:v008F* - ID_VENDOR_FROM_DATABASE=Telit Wireless Solutions GmbH (Formerly Stollman E+V GmbH) + ID_VENDOR_FROM_DATABASE=Telit Wireless Solutions GmbH (formerly Stollmann E+V GmbH) bluetooth:v0090* ID_VENDOR_FROM_DATABASE=Funai Electric Co., Ltd. bluetooth:v0091* - ID_VENDOR_FROM_DATABASE=Advanced PANMOBIL Systems GmbH & Co. KG + ID_VENDOR_FROM_DATABASE=Advanced PANMOBIL systems GmbH & Co. KG bluetooth:v0092* ID_VENDOR_FROM_DATABASE=ThinkOptics, Inc. @@ -462,8 +462,11 @@ bluetooth:v0096* bluetooth:v0097* ID_VENDOR_FROM_DATABASE=ConnecteDevice Ltd. +bluetooth:v0097p0002* + ID_PRODUCT_FROM_DATABASE=COOKOO watch + bluetooth:v0098* - ID_VENDOR_FROM_DATABASE=zer01.tv GmbH + ID_VENDOR_FROM_DATABASE=zero1.tv GmbH bluetooth:v0099* ID_VENDOR_FROM_DATABASE=i.Tech Dynamic Global Distribution Ltd. @@ -514,7 +517,7 @@ bluetooth:v00A8* ID_VENDOR_FROM_DATABASE=ARP Devices Limited bluetooth:v00A9* - ID_VENDOR_FROM_DATABASE=Magneti Marelli S.p.A + ID_VENDOR_FROM_DATABASE=MARELLI EUROPE S.P.A. (formerly Magneti Marelli S.p.A.) bluetooth:v00AA* ID_VENDOR_FROM_DATABASE=CAEN RFID srl @@ -712,7 +715,7 @@ bluetooth:v00EA* ID_VENDOR_FROM_DATABASE=Nielsen-Kellerman Company bluetooth:v00EB* - ID_VENDOR_FROM_DATABASE=Server Technology, Inc. + ID_VENDOR_FROM_DATABASE=Server Technology Inc. bluetooth:v00EC* ID_VENDOR_FROM_DATABASE=BioResearch Associates @@ -733,7 +736,7 @@ bluetooth:v00F1* ID_VENDOR_FROM_DATABASE=Witron Technology Limited bluetooth:v00F2* - ID_VENDOR_FROM_DATABASE=Aether Things Inc. (formerly Morse Project Inc.) + ID_VENDOR_FROM_DATABASE=Morse Project Inc. bluetooth:v00F3* ID_VENDOR_FROM_DATABASE=Kent Displays Inc. @@ -748,7 +751,7 @@ bluetooth:v00F6* ID_VENDOR_FROM_DATABASE=Elcometer Limited bluetooth:v00F7* - ID_VENDOR_FROM_DATABASE=VSN Technologies Inc. + ID_VENDOR_FROM_DATABASE=VSN Technologies, Inc. bluetooth:v00F8* ID_VENDOR_FROM_DATABASE=AceUni Corp., Ltd. @@ -769,7 +772,7 @@ bluetooth:v00FD* ID_VENDOR_FROM_DATABASE=ValenceTech Limited bluetooth:v00FE* - ID_VENDOR_FROM_DATABASE=Reserved + ID_VENDOR_FROM_DATABASE=Stanley Black and Decker bluetooth:v00FF* ID_VENDOR_FROM_DATABASE=Typo Products, LLC @@ -778,7 +781,7 @@ bluetooth:v0100* ID_VENDOR_FROM_DATABASE=TomTom International BV bluetooth:v0101* - ID_VENDOR_FROM_DATABASE=Fugoo, Inc + ID_VENDOR_FROM_DATABASE=Fugoo, Inc. bluetooth:v0102* ID_VENDOR_FROM_DATABASE=Keiser Corporation @@ -787,7 +790,7 @@ bluetooth:v0103* ID_VENDOR_FROM_DATABASE=Bang & Olufsen A/S bluetooth:v0104* - ID_VENDOR_FROM_DATABASE=PLUS Locations Systems Pty Ltd + ID_VENDOR_FROM_DATABASE=PLUS Location Systems Pty Ltd bluetooth:v0105* ID_VENDOR_FROM_DATABASE=Ubiquitous Computing Technology Corporation @@ -805,22 +808,22 @@ bluetooth:v0109* ID_VENDOR_FROM_DATABASE=Atus BV bluetooth:v010A* - ID_VENDOR_FROM_DATABASE=Codegate Ltd. + ID_VENDOR_FROM_DATABASE=Codegate Ltd bluetooth:v010B* - ID_VENDOR_FROM_DATABASE=ERi, Inc. + ID_VENDOR_FROM_DATABASE=ERi, Inc bluetooth:v010C* ID_VENDOR_FROM_DATABASE=Transducers Direct, LLC bluetooth:v010D* - ID_VENDOR_FROM_DATABASE=Fujitsu Ten Limited + ID_VENDOR_FROM_DATABASE=DENSO TEN LIMITED (formerly Fujitsu Ten LImited) bluetooth:v010E* ID_VENDOR_FROM_DATABASE=Audi AG bluetooth:v010F* - ID_VENDOR_FROM_DATABASE=HiSilicon Technologies Co., Ltd. + ID_VENDOR_FROM_DATABASE=HiSilicon Technologies CO., LIMITED bluetooth:v0110* ID_VENDOR_FROM_DATABASE=Nippon Seiki Co., Ltd. @@ -841,7 +844,7 @@ bluetooth:v0115* ID_VENDOR_FROM_DATABASE=e.solutions bluetooth:v0116* - ID_VENDOR_FROM_DATABASE=1OAK Technologies + ID_VENDOR_FROM_DATABASE=10AK Technologies bluetooth:v0117* ID_VENDOR_FROM_DATABASE=Wimoto Technologies Inc @@ -880,7 +883,7 @@ bluetooth:v0122* ID_VENDOR_FROM_DATABASE=AirTurn, Inc. bluetooth:v0123* - ID_VENDOR_FROM_DATABASE=Kinsa, Inc. + ID_VENDOR_FROM_DATABASE=Kinsa, Inc bluetooth:v0124* ID_VENDOR_FROM_DATABASE=HID Global @@ -901,7 +904,7 @@ bluetooth:v0129* ID_VENDOR_FROM_DATABASE=Nimble Devices Oy bluetooth:v012A* - ID_VENDOR_FROM_DATABASE=Changzhou Yongse Infotech Co., Ltd + ID_VENDOR_FROM_DATABASE=Changzhou Yongse Infotech Co., Ltd. bluetooth:v012B* ID_VENDOR_FROM_DATABASE=SportIQ @@ -916,13 +919,13 @@ bluetooth:v012E* ID_VENDOR_FROM_DATABASE=ASSA ABLOY bluetooth:v012F* - ID_VENDOR_FROM_DATABASE=Clarion Co., Ltd. + ID_VENDOR_FROM_DATABASE=Clarion Co. Inc. bluetooth:v0130* ID_VENDOR_FROM_DATABASE=Warehouse Innovations bluetooth:v0131* - ID_VENDOR_FROM_DATABASE=Cypress Semiconductor Corporation + ID_VENDOR_FROM_DATABASE=Cypress Semiconductor bluetooth:v0132* ID_VENDOR_FROM_DATABASE=MADS Inc @@ -931,13 +934,13 @@ bluetooth:v0133* ID_VENDOR_FROM_DATABASE=Blue Maestro Limited bluetooth:v0134* - ID_VENDOR_FROM_DATABASE=Resolution Products, Inc. + ID_VENDOR_FROM_DATABASE=Resolution Products, Ltd. bluetooth:v0135* - ID_VENDOR_FROM_DATABASE=Airewear LLC + ID_VENDOR_FROM_DATABASE=Aireware LLC bluetooth:v0136* - ID_VENDOR_FROM_DATABASE=Seed Labs, Inc. (formerly ETC sp. z.o.o.) + ID_VENDOR_FROM_DATABASE=Silvair, Inc. bluetooth:v0137* ID_VENDOR_FROM_DATABASE=Prestigio Plaza Ltd. @@ -949,13 +952,13 @@ bluetooth:v0139* ID_VENDOR_FROM_DATABASE=Focus Systems Corporation bluetooth:v013A* - ID_VENDOR_FROM_DATABASE=Tencent Holdings Limited + ID_VENDOR_FROM_DATABASE=Tencent Holdings Ltd. bluetooth:v013B* ID_VENDOR_FROM_DATABASE=Allegion bluetooth:v013C* - ID_VENDOR_FROM_DATABASE=Murata Manufacuring Co., Ltd. + ID_VENDOR_FROM_DATABASE=Murata Manufacturing Co., Ltd. bluetooth:v013D* ID_VENDOR_FROM_DATABASE=WirelessWERX @@ -1006,7 +1009,7 @@ bluetooth:v014C* ID_VENDOR_FROM_DATABASE=Mesh-Net Ltd bluetooth:v014D* - ID_VENDOR_FROM_DATABASE=Huizhou Desay SV Automotive CO., LTD. + ID_VENDOR_FROM_DATABASE=HUIZHOU DESAY SV AUTOMOTIVE CO., LTD. bluetooth:v014E* ID_VENDOR_FROM_DATABASE=Tangerine, Inc. @@ -1069,7 +1072,7 @@ bluetooth:v0161* ID_VENDOR_FROM_DATABASE=yikes bluetooth:v0162* - ID_VENDOR_FROM_DATABASE=MADSGlobal NZ Ltd. + ID_VENDOR_FROM_DATABASE=MADSGlobalNZ Ltd. bluetooth:v0163* ID_VENDOR_FROM_DATABASE=PCH International @@ -1078,13 +1081,13 @@ bluetooth:v0164* ID_VENDOR_FROM_DATABASE=Qingdao Yeelink Information Technology Co., Ltd. bluetooth:v0165* - ID_VENDOR_FROM_DATABASE=Milwaukee Tool (formerly Milwaukee Electric Tools) + ID_VENDOR_FROM_DATABASE=Milwaukee Tool (Formally Milwaukee Electric Tools) bluetooth:v0166* ID_VENDOR_FROM_DATABASE=MISHIK Pte Ltd bluetooth:v0167* - ID_VENDOR_FROM_DATABASE=Bayer HealthCare + ID_VENDOR_FROM_DATABASE=Ascensia Diabetes Care US Inc. bluetooth:v0168* ID_VENDOR_FROM_DATABASE=Spicebox LLC @@ -1111,7 +1114,7 @@ bluetooth:v016F* ID_VENDOR_FROM_DATABASE=Podo Labs, Inc bluetooth:v0170* - ID_VENDOR_FROM_DATABASE=F. Hoffmann-La Roche AG + ID_VENDOR_FROM_DATABASE=Roche Diabetes Care AG bluetooth:v0171* ID_VENDOR_FROM_DATABASE=Amazon Fulfillment Service @@ -1123,7 +1126,7 @@ bluetooth:v0173* ID_VENDOR_FROM_DATABASE=Kocomojo, LLC bluetooth:v0174* - ID_VENDOR_FROM_DATABASE=Everykey LLC + ID_VENDOR_FROM_DATABASE=Everykey Inc. bluetooth:v0175* ID_VENDOR_FROM_DATABASE=Dynamic Controls @@ -1156,7 +1159,7 @@ bluetooth:v017E* ID_VENDOR_FROM_DATABASE=BluDotz Ltd bluetooth:v017F* - ID_VENDOR_FROM_DATABASE=XTel ApS + ID_VENDOR_FROM_DATABASE=XTel Wireless ApS bluetooth:v0180* ID_VENDOR_FROM_DATABASE=Gigaset Communications GmbH @@ -1168,7 +1171,7 @@ bluetooth:v0182* ID_VENDOR_FROM_DATABASE=HOP Ubiquitous bluetooth:v0183* - ID_VENDOR_FROM_DATABASE=To Be Assigned + ID_VENDOR_FROM_DATABASE=Walt Disney bluetooth:v0184* ID_VENDOR_FROM_DATABASE=Nectar @@ -1228,10 +1231,10 @@ bluetooth:v0196* ID_VENDOR_FROM_DATABASE=Paxton Access Ltd bluetooth:v0197* - ID_VENDOR_FROM_DATABASE=WiSilica Inc + ID_VENDOR_FROM_DATABASE=WiSilica Inc. bluetooth:v0198* - ID_VENDOR_FROM_DATABASE=VENGIT Korlátolt Felelősségű Társaság + ID_VENDOR_FROM_DATABASE=VENGIT Korlatolt Felelossegu Tarsasag bluetooth:v0199* ID_VENDOR_FROM_DATABASE=SALTO SYSTEMS S.L. @@ -1273,7 +1276,7 @@ bluetooth:v01A5* ID_VENDOR_FROM_DATABASE=Icon Health and Fitness bluetooth:v01A6* - ID_VENDOR_FROM_DATABASE=Asandoo GmbH + ID_VENDOR_FROM_DATABASE=Wille Engineering (formely as Asandoo GmbH) bluetooth:v01A7* ID_VENDOR_FROM_DATABASE=ENERGOUS CORPORATION @@ -1291,7 +1294,7 @@ bluetooth:v01AB* ID_VENDOR_FROM_DATABASE=Facebook, Inc. bluetooth:v01AC* - ID_VENDOR_FROM_DATABASE=Nipro Diagnostics, Inc. + ID_VENDOR_FROM_DATABASE=Trividia Health, Inc. bluetooth:v01AD* ID_VENDOR_FROM_DATABASE=FlightSafety International @@ -1402,7 +1405,7 @@ bluetooth:v01D0* ID_VENDOR_FROM_DATABASE=Primus Inter Pares Ltd bluetooth:v01D1* - ID_VENDOR_FROM_DATABASE=August + ID_VENDOR_FROM_DATABASE=August Home, Inc bluetooth:v01D2* ID_VENDOR_FROM_DATABASE=Gill Electronics @@ -1474,7 +1477,7 @@ bluetooth:v01E8* ID_VENDOR_FROM_DATABASE=STIR bluetooth:v01E9* - ID_VENDOR_FROM_DATABASE=Sano, Inc + ID_VENDOR_FROM_DATABASE=Sano, Inc. bluetooth:v01EA* ID_VENDOR_FROM_DATABASE=Advanced Application Design, Inc. @@ -1522,10 +1525,10 @@ bluetooth:v01F8* ID_VENDOR_FROM_DATABASE=Anyka (Guangzhou) Microelectronics Technology Co, LTD bluetooth:v01F9* - ID_VENDOR_FROM_DATABASE=Medtronic, Inc. + ID_VENDOR_FROM_DATABASE=Medtronic Inc. bluetooth:v01FA* - ID_VENDOR_FROM_DATABASE=Gozio, Inc. + ID_VENDOR_FROM_DATABASE=Gozio Inc. bluetooth:v01FB* ID_VENDOR_FROM_DATABASE=Form Lifting, LLC @@ -1537,13 +1540,13 @@ bluetooth:v01FD* ID_VENDOR_FROM_DATABASE=Kontakt Micro-Location Sp. z o.o. bluetooth:v01FE* - ID_VENDOR_FROM_DATABASE=Radio System Corporation + ID_VENDOR_FROM_DATABASE=Radio Systems Corporation bluetooth:v01FF* ID_VENDOR_FROM_DATABASE=Freescale Semiconductor, Inc. bluetooth:v0200* - ID_VENDOR_FROM_DATABASE=Verifone Systems PTe Ltd. Taiwan Branch + ID_VENDOR_FROM_DATABASE=Verifone Systems Pte Ltd. Taiwan Branch bluetooth:v0201* ID_VENDOR_FROM_DATABASE=AR Timing @@ -1624,7 +1627,7 @@ bluetooth:v021A* ID_VENDOR_FROM_DATABASE=Blue Speck Labs, LLC bluetooth:v021B* - ID_VENDOR_FROM_DATABASE=Cisco Systems Inc + ID_VENDOR_FROM_DATABASE=Cisco Systems, Inc bluetooth:v021C* ID_VENDOR_FROM_DATABASE=Mobicomm Inc @@ -1633,10 +1636,10 @@ bluetooth:v021D* ID_VENDOR_FROM_DATABASE=Edamic bluetooth:v021E* - ID_VENDOR_FROM_DATABASE=Goodnet Ltd + ID_VENDOR_FROM_DATABASE=Goodnet, Ltd bluetooth:v021F* - ID_VENDOR_FROM_DATABASE=Luster Leaf Products Inc + ID_VENDOR_FROM_DATABASE=Luster Leaf Products Inc bluetooth:v0220* ID_VENDOR_FROM_DATABASE=Manus Machina BV @@ -1717,7 +1720,7 @@ bluetooth:v0239* ID_VENDOR_FROM_DATABASE=JIN CO, Ltd bluetooth:v023A* - ID_VENDOR_FROM_DATABASE=Alatech Technology + ID_VENDOR_FROM_DATABASE=Alatech Tehnology bluetooth:v023B* ID_VENDOR_FROM_DATABASE=Beijing CarePulse Electronic Technology Co, Ltd @@ -1732,7 +1735,7 @@ bluetooth:v023E* ID_VENDOR_FROM_DATABASE=Raven Industries bluetooth:v023F* - ID_VENDOR_FROM_DATABASE=WaveWare Technologies + ID_VENDOR_FROM_DATABASE=WaveWare Technologies Inc. bluetooth:v0240* ID_VENDOR_FROM_DATABASE=Argenox Technologies @@ -1747,10 +1750,10 @@ bluetooth:v0243* ID_VENDOR_FROM_DATABASE=Masimo Corp bluetooth:v0244* - ID_VENDOR_FROM_DATABASE=Iotera Inc. + ID_VENDOR_FROM_DATABASE=Iotera Inc bluetooth:v0245* - ID_VENDOR_FROM_DATABASE=Endress+Hauser + ID_VENDOR_FROM_DATABASE=Endress+Hauser  bluetooth:v0246* ID_VENDOR_FROM_DATABASE=ACKme Networks, Inc. @@ -1819,7 +1822,7 @@ bluetooth:v025B* ID_VENDOR_FROM_DATABASE=Five Interactive, LLC dba Zendo bluetooth:v025C* - ID_VENDOR_FROM_DATABASE=NetEase (Hangzhou) Network co.Ltd. + ID_VENDOR_FROM_DATABASE=NetEase(Hangzhou)Network co.Ltd. bluetooth:v025D* ID_VENDOR_FROM_DATABASE=Lexmark International Inc. @@ -1897,7 +1900,7 @@ bluetooth:v0275* ID_VENDOR_FROM_DATABASE=Geotab bluetooth:v0276* - ID_VENDOR_FROM_DATABASE=E.G.O. Elektro-Gerätebau GmbH + ID_VENDOR_FROM_DATABASE=E.G.O. Elektro-Geraetebau GmbH bluetooth:v0277* ID_VENDOR_FROM_DATABASE=bewhere inc @@ -1918,7 +1921,7 @@ bluetooth:v027C* ID_VENDOR_FROM_DATABASE=Aseptika Ltd bluetooth:v027D* - ID_VENDOR_FROM_DATABASE=HUAWEI Technologies Co., Ltd. ( 华为技术有限公司 ) + ID_VENDOR_FROM_DATABASE=HUAWEI Technologies Co., Ltd. bluetooth:v027E* ID_VENDOR_FROM_DATABASE=HabitAware, LLC @@ -2323,7 +2326,7 @@ bluetooth:v0303* ID_VENDOR_FROM_DATABASE=IACA electronique bluetooth:v0304* - ID_VENDOR_FROM_DATABASE=Martians Inc + ID_VENDOR_FROM_DATABASE=Proxy Technologies, Inc. bluetooth:v0305* ID_VENDOR_FROM_DATABASE=Swipp ApS @@ -3082,7 +3085,7 @@ bluetooth:v0400* ID_VENDOR_FROM_DATABASE=i-developer IT Beratung UG bluetooth:v0401* - ID_VENDOR_FROM_DATABASE=リレーションズ株式会社 + ID_VENDOR_FROM_DATABASE=Relations Inc. bluetooth:v0402* ID_VENDOR_FROM_DATABASE=Sears Holdings Corporation @@ -3119,3 +3122,3555 @@ bluetooth:v040C* bluetooth:v040D* ID_VENDOR_FROM_DATABASE=NorthStar Battery Company, LLC + +bluetooth:v040E* + ID_VENDOR_FROM_DATABASE=SKF (U.K.) Limited + +bluetooth:v040F* + ID_VENDOR_FROM_DATABASE=CO-AX Technology, Inc. + +bluetooth:v0410* + ID_VENDOR_FROM_DATABASE=Fender Musical Instruments + +bluetooth:v0411* + ID_VENDOR_FROM_DATABASE=Luidia Inc + +bluetooth:v0412* + ID_VENDOR_FROM_DATABASE=SEFAM + +bluetooth:v0413* + ID_VENDOR_FROM_DATABASE=Wireless Cables Inc + +bluetooth:v0414* + ID_VENDOR_FROM_DATABASE=Lightning Protection International Pty Ltd + +bluetooth:v0415* + ID_VENDOR_FROM_DATABASE=Uber Technologies Inc + +bluetooth:v0416* + ID_VENDOR_FROM_DATABASE=SODA GmbH + +bluetooth:v0417* + ID_VENDOR_FROM_DATABASE=Fatigue Science + +bluetooth:v0418* + ID_VENDOR_FROM_DATABASE=Alpine Electronics Inc. + +bluetooth:v0419* + ID_VENDOR_FROM_DATABASE=Novalogy LTD + +bluetooth:v041A* + ID_VENDOR_FROM_DATABASE=Friday Labs Limited + +bluetooth:v041B* + ID_VENDOR_FROM_DATABASE=OrthoAccel Technologies + +bluetooth:v041C* + ID_VENDOR_FROM_DATABASE=WaterGuru, Inc. + +bluetooth:v041D* + ID_VENDOR_FROM_DATABASE=Benning Elektrotechnik und Elektronik GmbH & Co. KG + +bluetooth:v041E* + ID_VENDOR_FROM_DATABASE=Dell Computer Corporation + +bluetooth:v041F* + ID_VENDOR_FROM_DATABASE=Kopin Corporation + +bluetooth:v0420* + ID_VENDOR_FROM_DATABASE=TecBakery GmbH + +bluetooth:v0421* + ID_VENDOR_FROM_DATABASE=Backbone Labs, Inc. + +bluetooth:v0422* + ID_VENDOR_FROM_DATABASE=DELSEY SA + +bluetooth:v0423* + ID_VENDOR_FROM_DATABASE=Chargifi Limited + +bluetooth:v0424* + ID_VENDOR_FROM_DATABASE=Trainesense Ltd. + +bluetooth:v0425* + ID_VENDOR_FROM_DATABASE=Unify Software and Solutions GmbH & Co. KG + +bluetooth:v0426* + ID_VENDOR_FROM_DATABASE=Husqvarna AB + +bluetooth:v0427* + ID_VENDOR_FROM_DATABASE=Focus fleet and fuel management inc + +bluetooth:v0428* + ID_VENDOR_FROM_DATABASE=SmallLoop, LLC + +bluetooth:v0429* + ID_VENDOR_FROM_DATABASE=Prolon Inc. + +bluetooth:v042A* + ID_VENDOR_FROM_DATABASE=BD Medical + +bluetooth:v042B* + ID_VENDOR_FROM_DATABASE=iMicroMed Incorporated + +bluetooth:v042C* + ID_VENDOR_FROM_DATABASE=Ticto N.V. + +bluetooth:v042D* + ID_VENDOR_FROM_DATABASE=Meshtech AS + +bluetooth:v042E* + ID_VENDOR_FROM_DATABASE=MemCachier Inc. + +bluetooth:v042F* + ID_VENDOR_FROM_DATABASE=Danfoss A/S + +bluetooth:v0430* + ID_VENDOR_FROM_DATABASE=SnapStyk Inc. + +bluetooth:v0431* + ID_VENDOR_FROM_DATABASE=Amway Corporation + +bluetooth:v0432* + ID_VENDOR_FROM_DATABASE=Silk Labs, Inc. + +bluetooth:v0433* + ID_VENDOR_FROM_DATABASE=Pillsy Inc. + +bluetooth:v0434* + ID_VENDOR_FROM_DATABASE=Hatch Baby, Inc. + +bluetooth:v0435* + ID_VENDOR_FROM_DATABASE=Blocks Wearables Ltd. + +bluetooth:v0436* + ID_VENDOR_FROM_DATABASE=Drayson Technologies (Europe) Limited + +bluetooth:v0437* + ID_VENDOR_FROM_DATABASE=eBest IOT Inc. + +bluetooth:v0438* + ID_VENDOR_FROM_DATABASE=Helvar Ltd + +bluetooth:v0439* + ID_VENDOR_FROM_DATABASE=Radiance Technologies + +bluetooth:v043A* + ID_VENDOR_FROM_DATABASE=Nuheara Limited + +bluetooth:v043B* + ID_VENDOR_FROM_DATABASE=Appside co., ltd. + +bluetooth:v043C* + ID_VENDOR_FROM_DATABASE=DeLaval + +bluetooth:v043D* + ID_VENDOR_FROM_DATABASE=Coiler Corporation + +bluetooth:v043E* + ID_VENDOR_FROM_DATABASE=Thermomedics, Inc. + +bluetooth:v043F* + ID_VENDOR_FROM_DATABASE=Tentacle Sync GmbH + +bluetooth:v0440* + ID_VENDOR_FROM_DATABASE=Valencell, Inc. + +bluetooth:v0441* + ID_VENDOR_FROM_DATABASE=iProtoXi Oy + +bluetooth:v0442* + ID_VENDOR_FROM_DATABASE=SECOM CO., LTD. + +bluetooth:v0443* + ID_VENDOR_FROM_DATABASE=Tucker International LLC + +bluetooth:v0444* + ID_VENDOR_FROM_DATABASE=Metanate Limited + +bluetooth:v0445* + ID_VENDOR_FROM_DATABASE=Kobian Canada Inc. + +bluetooth:v0446* + ID_VENDOR_FROM_DATABASE=NETGEAR, Inc. + +bluetooth:v0447* + ID_VENDOR_FROM_DATABASE=Fabtronics Australia Pty Ltd + +bluetooth:v0448* + ID_VENDOR_FROM_DATABASE=Grand Centrix GmbH + +bluetooth:v0449* + ID_VENDOR_FROM_DATABASE=1UP USA.com llc + +bluetooth:v044A* + ID_VENDOR_FROM_DATABASE=SHIMANO INC. + +bluetooth:v044B* + ID_VENDOR_FROM_DATABASE=Nain Inc. + +bluetooth:v044C* + ID_VENDOR_FROM_DATABASE=LifeStyle Lock, LLC + +bluetooth:v044D* + ID_VENDOR_FROM_DATABASE=VEGA Grieshaber KG + +bluetooth:v044E* + ID_VENDOR_FROM_DATABASE=Xtrava Inc. + +bluetooth:v044F* + ID_VENDOR_FROM_DATABASE=TTS Tooltechnic Systems AG & Co. KG + +bluetooth:v0450* + ID_VENDOR_FROM_DATABASE=Teenage Engineering AB + +bluetooth:v0451* + ID_VENDOR_FROM_DATABASE=Tunstall Nordic AB + +bluetooth:v0452* + ID_VENDOR_FROM_DATABASE=Svep Design Center AB + +bluetooth:v0453* + ID_VENDOR_FROM_DATABASE=GreenPeak Technologies BV + +bluetooth:v0454* + ID_VENDOR_FROM_DATABASE=Sphinx Electronics GmbH & Co KG + +bluetooth:v0455* + ID_VENDOR_FROM_DATABASE=Atomation + +bluetooth:v0456* + ID_VENDOR_FROM_DATABASE=Nemik Consulting Inc + +bluetooth:v0457* + ID_VENDOR_FROM_DATABASE=RF INNOVATION + +bluetooth:v0458* + ID_VENDOR_FROM_DATABASE=Mini Solution Co., Ltd. + +bluetooth:v0459* + ID_VENDOR_FROM_DATABASE=Lumenetix, Inc + +bluetooth:v045A* + ID_VENDOR_FROM_DATABASE=2048450 Ontario Inc + +bluetooth:v045B* + ID_VENDOR_FROM_DATABASE=SPACEEK LTD + +bluetooth:v045C* + ID_VENDOR_FROM_DATABASE=Delta T Corporation + +bluetooth:v045D* + ID_VENDOR_FROM_DATABASE=Boston Scientific Corporation + +bluetooth:v045E* + ID_VENDOR_FROM_DATABASE=Nuviz, Inc. + +bluetooth:v045F* + ID_VENDOR_FROM_DATABASE=Real Time Automation, Inc. + +bluetooth:v0460* + ID_VENDOR_FROM_DATABASE=Kolibree + +bluetooth:v0461* + ID_VENDOR_FROM_DATABASE=vhf elektronik GmbH + +bluetooth:v0462* + ID_VENDOR_FROM_DATABASE=Bonsai Systems GmbH + +bluetooth:v0463* + ID_VENDOR_FROM_DATABASE=Fathom Systems Inc. + +bluetooth:v0464* + ID_VENDOR_FROM_DATABASE=Bellman & Symfon + +bluetooth:v0465* + ID_VENDOR_FROM_DATABASE=International Forte Group LLC + +bluetooth:v0466* + ID_VENDOR_FROM_DATABASE=CycleLabs Solutions inc. + +bluetooth:v0467* + ID_VENDOR_FROM_DATABASE=Codenex Oy + +bluetooth:v0468* + ID_VENDOR_FROM_DATABASE=Kynesim Ltd + +bluetooth:v0469* + ID_VENDOR_FROM_DATABASE=Palago AB + +bluetooth:v046A* + ID_VENDOR_FROM_DATABASE=INSIGMA INC. + +bluetooth:v046B* + ID_VENDOR_FROM_DATABASE=PMD Solutions + +bluetooth:v046C* + ID_VENDOR_FROM_DATABASE=Qingdao Realtime Technology Co., Ltd. + +bluetooth:v046D* + ID_VENDOR_FROM_DATABASE=BEGA Gantenbrink-Leuchten KG + +bluetooth:v046E* + ID_VENDOR_FROM_DATABASE=Pambor Ltd. + +bluetooth:v046F* + ID_VENDOR_FROM_DATABASE=Develco Products A/S + +bluetooth:v0470* + ID_VENDOR_FROM_DATABASE=iDesign s.r.l. + +bluetooth:v0471* + ID_VENDOR_FROM_DATABASE=TiVo Corp + +bluetooth:v0472* + ID_VENDOR_FROM_DATABASE=Control-J Pty Ltd + +bluetooth:v0473* + ID_VENDOR_FROM_DATABASE=Steelcase, Inc. + +bluetooth:v0474* + ID_VENDOR_FROM_DATABASE=iApartment co., ltd. + +bluetooth:v0475* + ID_VENDOR_FROM_DATABASE=Icom inc. + +bluetooth:v0476* + ID_VENDOR_FROM_DATABASE=Oxstren Wearable Technologies Private Limited + +bluetooth:v0477* + ID_VENDOR_FROM_DATABASE=Blue Spark Technologies + +bluetooth:v0478* + ID_VENDOR_FROM_DATABASE=FarSite Communications Limited + +bluetooth:v0479* + ID_VENDOR_FROM_DATABASE=mywerk system GmbH + +bluetooth:v047A* + ID_VENDOR_FROM_DATABASE=Sinosun Technology Co., Ltd. + +bluetooth:v047B* + ID_VENDOR_FROM_DATABASE=MIYOSHI ELECTRONICS CORPORATION + +bluetooth:v047C* + ID_VENDOR_FROM_DATABASE=POWERMAT LTD + +bluetooth:v047D* + ID_VENDOR_FROM_DATABASE=Occly LLC + +bluetooth:v047E* + ID_VENDOR_FROM_DATABASE=OurHub Dev IvS + +bluetooth:v047F* + ID_VENDOR_FROM_DATABASE=Pro-Mark, Inc. + +bluetooth:v0480* + ID_VENDOR_FROM_DATABASE=Dynometrics Inc. + +bluetooth:v0481* + ID_VENDOR_FROM_DATABASE=Quintrax Limited + +bluetooth:v0482* + ID_VENDOR_FROM_DATABASE=POS Tuning Udo Vosshenrich GmbH & Co. KG + +bluetooth:v0483* + ID_VENDOR_FROM_DATABASE=Multi Care Systems B.V. + +bluetooth:v0484* + ID_VENDOR_FROM_DATABASE=Revol Technologies Inc + +bluetooth:v0485* + ID_VENDOR_FROM_DATABASE=SKIDATA AG + +bluetooth:v0486* + ID_VENDOR_FROM_DATABASE=DEV TECNOLOGIA INDUSTRIA, COMERCIO E MANUTENCAO DE EQUIPAMENTOS LTDA. - ME + +bluetooth:v0487* + ID_VENDOR_FROM_DATABASE=Centrica Connected Home + +bluetooth:v0488* + ID_VENDOR_FROM_DATABASE=Automotive Data Solutions Inc + +bluetooth:v0489* + ID_VENDOR_FROM_DATABASE=Igarashi Engineering + +bluetooth:v048A* + ID_VENDOR_FROM_DATABASE=Taelek Oy + +bluetooth:v048B* + ID_VENDOR_FROM_DATABASE=CP Electronics Limited + +bluetooth:v048C* + ID_VENDOR_FROM_DATABASE=Vectronix AG + +bluetooth:v048D* + ID_VENDOR_FROM_DATABASE=S-Labs Sp. z o.o. + +bluetooth:v048E* + ID_VENDOR_FROM_DATABASE=Companion Medical, Inc. + +bluetooth:v048F* + ID_VENDOR_FROM_DATABASE=BlueKitchen GmbH + +bluetooth:v0490* + ID_VENDOR_FROM_DATABASE=Matting AB + +bluetooth:v0491* + ID_VENDOR_FROM_DATABASE=SOREX - Wireless Solutions GmbH + +bluetooth:v0492* + ID_VENDOR_FROM_DATABASE=ADC Technology, Inc. + +bluetooth:v0493* + ID_VENDOR_FROM_DATABASE=Lynxemi Pte Ltd + +bluetooth:v0494* + ID_VENDOR_FROM_DATABASE=SENNHEISER electronic GmbH & Co. KG + +bluetooth:v0495* + ID_VENDOR_FROM_DATABASE=LMT Mercer Group, Inc + +bluetooth:v0496* + ID_VENDOR_FROM_DATABASE=Polymorphic Labs LLC + +bluetooth:v0497* + ID_VENDOR_FROM_DATABASE=Cochlear Limited + +bluetooth:v0498* + ID_VENDOR_FROM_DATABASE=METER Group, Inc. USA + +bluetooth:v0499* + ID_VENDOR_FROM_DATABASE=Ruuvi Innovations Ltd. + +bluetooth:v049A* + ID_VENDOR_FROM_DATABASE=Situne AS + +bluetooth:v049B* + ID_VENDOR_FROM_DATABASE=nVisti, LLC + +bluetooth:v049C* + ID_VENDOR_FROM_DATABASE=DyOcean + +bluetooth:v049D* + ID_VENDOR_FROM_DATABASE=Uhlmann & Zacher GmbH + +bluetooth:v049E* + ID_VENDOR_FROM_DATABASE=AND!XOR LLC + +bluetooth:v049F* + ID_VENDOR_FROM_DATABASE=tictote AB + +bluetooth:v04A0* + ID_VENDOR_FROM_DATABASE=Vypin, LLC + +bluetooth:v04A1* + ID_VENDOR_FROM_DATABASE=PNI Sensor Corporation + +bluetooth:v04A2* + ID_VENDOR_FROM_DATABASE=ovrEngineered, LLC + +bluetooth:v04A3* + ID_VENDOR_FROM_DATABASE=GT-tronics HK Ltd + +bluetooth:v04A4* + ID_VENDOR_FROM_DATABASE=Herbert Waldmann GmbH & Co. KG + +bluetooth:v04A5* + ID_VENDOR_FROM_DATABASE=Guangzhou FiiO Electronics Technology Co.,Ltd + +bluetooth:v04A6* + ID_VENDOR_FROM_DATABASE=Vinetech Co., Ltd + +bluetooth:v04A7* + ID_VENDOR_FROM_DATABASE=Dallas Logic Corporation + +bluetooth:v04A8* + ID_VENDOR_FROM_DATABASE=BioTex, Inc. + +bluetooth:v04A9* + ID_VENDOR_FROM_DATABASE=DISCOVERY SOUND TECHNOLOGY, LLC + +bluetooth:v04AA* + ID_VENDOR_FROM_DATABASE=LINKIO SAS + +bluetooth:v04AB* + ID_VENDOR_FROM_DATABASE=Harbortronics, Inc. + +bluetooth:v04AC* + ID_VENDOR_FROM_DATABASE=Undagrid B.V. + +bluetooth:v04AD* + ID_VENDOR_FROM_DATABASE=Shure Inc + +bluetooth:v04AE* + ID_VENDOR_FROM_DATABASE=ERM Electronic Systems LTD + +bluetooth:v04AF* + ID_VENDOR_FROM_DATABASE=BIOROWER Handelsagentur GmbH + +bluetooth:v04B0* + ID_VENDOR_FROM_DATABASE=Weba Sport und Med. Artikel GmbH + +bluetooth:v04B1* + ID_VENDOR_FROM_DATABASE=Kartographers Technologies Pvt. Ltd. + +bluetooth:v04B2* + ID_VENDOR_FROM_DATABASE=The Shadow on the Moon + +bluetooth:v04B3* + ID_VENDOR_FROM_DATABASE=mobike (Hong Kong) Limited + +bluetooth:v04B4* + ID_VENDOR_FROM_DATABASE=Inuheat Group AB + +bluetooth:v04B5* + ID_VENDOR_FROM_DATABASE=Swiftronix AB + +bluetooth:v04B6* + ID_VENDOR_FROM_DATABASE=Diagnoptics Technologies + +bluetooth:v04B7* + ID_VENDOR_FROM_DATABASE=Analog Devices, Inc. + +bluetooth:v04B8* + ID_VENDOR_FROM_DATABASE=Soraa Inc. + +bluetooth:v04B9* + ID_VENDOR_FROM_DATABASE=CSR Building Products Limited + +bluetooth:v04BA* + ID_VENDOR_FROM_DATABASE=Crestron Electronics, Inc. + +bluetooth:v04BB* + ID_VENDOR_FROM_DATABASE=Neatebox Ltd + +bluetooth:v04BC* + ID_VENDOR_FROM_DATABASE=Draegerwerk AG & Co. KGaA + +bluetooth:v04BD* + ID_VENDOR_FROM_DATABASE=AlbynMedical + +bluetooth:v04BE* + ID_VENDOR_FROM_DATABASE=Averos FZCO + +bluetooth:v04BF* + ID_VENDOR_FROM_DATABASE=VIT Initiative, LLC + +bluetooth:v04C0* + ID_VENDOR_FROM_DATABASE=Statsports International + +bluetooth:v04C1* + ID_VENDOR_FROM_DATABASE=Sospitas, s.r.o. + +bluetooth:v04C2* + ID_VENDOR_FROM_DATABASE=Dmet Products Corp. + +bluetooth:v04C3* + ID_VENDOR_FROM_DATABASE=Mantracourt Electronics Limited + +bluetooth:v04C4* + ID_VENDOR_FROM_DATABASE=TeAM Hutchins AB + +bluetooth:v04C5* + ID_VENDOR_FROM_DATABASE=Seibert Williams Glass, LLC + +bluetooth:v04C6* + ID_VENDOR_FROM_DATABASE=Insta GmbH + +bluetooth:v04C7* + ID_VENDOR_FROM_DATABASE=Svantek Sp. z o.o. + +bluetooth:v04C8* + ID_VENDOR_FROM_DATABASE=Shanghai Flyco Electrical Appliance Co., Ltd. + +bluetooth:v04C9* + ID_VENDOR_FROM_DATABASE=Thornwave Labs Inc + +bluetooth:v04CA* + ID_VENDOR_FROM_DATABASE=Steiner-Optik GmbH + +bluetooth:v04CB* + ID_VENDOR_FROM_DATABASE=Novo Nordisk A/S + +bluetooth:v04CC* + ID_VENDOR_FROM_DATABASE=Enflux Inc. + +bluetooth:v04CD* + ID_VENDOR_FROM_DATABASE=Safetech Products LLC + +bluetooth:v04CE* + ID_VENDOR_FROM_DATABASE=GOOOLED S.R.L. + +bluetooth:v04CF* + ID_VENDOR_FROM_DATABASE=DOM Sicherheitstechnik GmbH & Co. KG + +bluetooth:v04D0* + ID_VENDOR_FROM_DATABASE=Olympus Corporation + +bluetooth:v04D1* + ID_VENDOR_FROM_DATABASE=KTS GmbH + +bluetooth:v04D2* + ID_VENDOR_FROM_DATABASE=Anloq Technologies Inc. + +bluetooth:v04D3* + ID_VENDOR_FROM_DATABASE=Queercon, Inc + +bluetooth:v04D4* + ID_VENDOR_FROM_DATABASE=5th Element Ltd + +bluetooth:v04D5* + ID_VENDOR_FROM_DATABASE=Gooee Limited + +bluetooth:v04D6* + ID_VENDOR_FROM_DATABASE=LUGLOC LLC + +bluetooth:v04D7* + ID_VENDOR_FROM_DATABASE=Blincam, Inc. + +bluetooth:v04D8* + ID_VENDOR_FROM_DATABASE=FUJIFILM Corporation + +bluetooth:v04D9* + ID_VENDOR_FROM_DATABASE=RandMcNally + +bluetooth:v04DA* + ID_VENDOR_FROM_DATABASE=Franceschi Marina snc + +bluetooth:v04DB* + ID_VENDOR_FROM_DATABASE=Engineered Audio, LLC. + +bluetooth:v04DC* + ID_VENDOR_FROM_DATABASE=IOTTIVE (OPC) PRIVATE LIMITED + +bluetooth:v04DD* + ID_VENDOR_FROM_DATABASE=4MOD Technology + +bluetooth:v04DE* + ID_VENDOR_FROM_DATABASE=Lutron Electronics Co., Inc. + +bluetooth:v04DF* + ID_VENDOR_FROM_DATABASE=Emerson + +bluetooth:v04E0* + ID_VENDOR_FROM_DATABASE=Guardtec, Inc. + +bluetooth:v04E1* + ID_VENDOR_FROM_DATABASE=REACTEC LIMITED + +bluetooth:v04E2* + ID_VENDOR_FROM_DATABASE=EllieGrid + +bluetooth:v04E3* + ID_VENDOR_FROM_DATABASE=Under Armour + +bluetooth:v04E4* + ID_VENDOR_FROM_DATABASE=Woodenshark + +bluetooth:v04E5* + ID_VENDOR_FROM_DATABASE=Avack Oy + +bluetooth:v04E6* + ID_VENDOR_FROM_DATABASE=Smart Solution Technology, Inc. + +bluetooth:v04E7* + ID_VENDOR_FROM_DATABASE=REHABTRONICS INC. + +bluetooth:v04E8* + ID_VENDOR_FROM_DATABASE=STABILO International + +bluetooth:v04E9* + ID_VENDOR_FROM_DATABASE=Busch Jaeger Elektro GmbH + +bluetooth:v04EA* + ID_VENDOR_FROM_DATABASE=Pacific Bioscience Laboratories, Inc + +bluetooth:v04EB* + ID_VENDOR_FROM_DATABASE=Bird Home Automation GmbH + +bluetooth:v04EC* + ID_VENDOR_FROM_DATABASE=Motorola Solutions + +bluetooth:v04ED* + ID_VENDOR_FROM_DATABASE=R9 Technology, Inc. + +bluetooth:v04EE* + ID_VENDOR_FROM_DATABASE=Auxivia + +bluetooth:v04EF* + ID_VENDOR_FROM_DATABASE=DaisyWorks, Inc + +bluetooth:v04F0* + ID_VENDOR_FROM_DATABASE=Kosi Limited + +bluetooth:v04F1* + ID_VENDOR_FROM_DATABASE=Theben AG + +bluetooth:v04F2* + ID_VENDOR_FROM_DATABASE=InDreamer Techsol Private Limited + +bluetooth:v04F3* + ID_VENDOR_FROM_DATABASE=Cerevast Medical + +bluetooth:v04F4* + ID_VENDOR_FROM_DATABASE=ZanCompute Inc. + +bluetooth:v04F5* + ID_VENDOR_FROM_DATABASE=Pirelli Tyre S.P.A. + +bluetooth:v04F6* + ID_VENDOR_FROM_DATABASE=McLear Limited + +bluetooth:v04F7* + ID_VENDOR_FROM_DATABASE=Shenzhen Huiding Technology Co.,Ltd. + +bluetooth:v04F8* + ID_VENDOR_FROM_DATABASE=Convergence Systems Limited + +bluetooth:v04F9* + ID_VENDOR_FROM_DATABASE=Interactio + +bluetooth:v04FA* + ID_VENDOR_FROM_DATABASE=Androtec GmbH + +bluetooth:v04FB* + ID_VENDOR_FROM_DATABASE=Benchmark Drives GmbH & Co. KG + +bluetooth:v04FC* + ID_VENDOR_FROM_DATABASE=SwingLync L. L. C. + +bluetooth:v04FD* + ID_VENDOR_FROM_DATABASE=Tapkey GmbH + +bluetooth:v04FE* + ID_VENDOR_FROM_DATABASE=Woosim Systems Inc. + +bluetooth:v04FF* + ID_VENDOR_FROM_DATABASE=Microsemi Corporation + +bluetooth:v0500* + ID_VENDOR_FROM_DATABASE=Wiliot LTD. + +bluetooth:v0501* + ID_VENDOR_FROM_DATABASE=Polaris IND + +bluetooth:v0502* + ID_VENDOR_FROM_DATABASE=Specifi-Kali LLC + +bluetooth:v0503* + ID_VENDOR_FROM_DATABASE=Locoroll, Inc + +bluetooth:v0504* + ID_VENDOR_FROM_DATABASE=PHYPLUS Inc + +bluetooth:v0505* + ID_VENDOR_FROM_DATABASE=Inplay Technologies LLC + +bluetooth:v0506* + ID_VENDOR_FROM_DATABASE=Hager + +bluetooth:v0507* + ID_VENDOR_FROM_DATABASE=Yellowcog + +bluetooth:v0508* + ID_VENDOR_FROM_DATABASE=Axes System sp. z o. o. + +bluetooth:v0509* + ID_VENDOR_FROM_DATABASE=myLIFTER Inc. + +bluetooth:v050A* + ID_VENDOR_FROM_DATABASE=Shake-on B.V. + +bluetooth:v050B* + ID_VENDOR_FROM_DATABASE=Vibrissa Inc. + +bluetooth:v050C* + ID_VENDOR_FROM_DATABASE=OSRAM GmbH + +bluetooth:v050D* + ID_VENDOR_FROM_DATABASE=TRSystems GmbH + +bluetooth:v050E* + ID_VENDOR_FROM_DATABASE=Yichip Microelectronics (Hangzhou) Co.,Ltd. + +bluetooth:v050F* + ID_VENDOR_FROM_DATABASE=Foundation Engineering LLC + +bluetooth:v0510* + ID_VENDOR_FROM_DATABASE=UNI-ELECTRONICS, INC. + +bluetooth:v0511* + ID_VENDOR_FROM_DATABASE=Brookfield Equinox LLC + +bluetooth:v0512* + ID_VENDOR_FROM_DATABASE=Soprod SA + +bluetooth:v0513* + ID_VENDOR_FROM_DATABASE=9974091 Canada Inc. + +bluetooth:v0514* + ID_VENDOR_FROM_DATABASE=FIBRO GmbH + +bluetooth:v0515* + ID_VENDOR_FROM_DATABASE=RB Controls Co., Ltd. + +bluetooth:v0516* + ID_VENDOR_FROM_DATABASE=Footmarks + +bluetooth:v0517* + ID_VENDOR_FROM_DATABASE=Amtronic Sverige AB (formerly Amcore AB) + +bluetooth:v0518* + ID_VENDOR_FROM_DATABASE=MAMORIO.inc + +bluetooth:v0519* + ID_VENDOR_FROM_DATABASE=Tyto Life LLC + +bluetooth:v051A* + ID_VENDOR_FROM_DATABASE=Leica Camera AG + +bluetooth:v051B* + ID_VENDOR_FROM_DATABASE=Angee Technologies Ltd. + +bluetooth:v051C* + ID_VENDOR_FROM_DATABASE=EDPS + +bluetooth:v051D* + ID_VENDOR_FROM_DATABASE=OFF Line Co., Ltd. + +bluetooth:v051E* + ID_VENDOR_FROM_DATABASE=Detect Blue Limited + +bluetooth:v051F* + ID_VENDOR_FROM_DATABASE=Setec Pty Ltd + +bluetooth:v0520* + ID_VENDOR_FROM_DATABASE=Target Corporation + +bluetooth:v0521* + ID_VENDOR_FROM_DATABASE=IAI Corporation + +bluetooth:v0522* + ID_VENDOR_FROM_DATABASE=NS Tech, Inc. + +bluetooth:v0523* + ID_VENDOR_FROM_DATABASE=MTG Co., Ltd. + +bluetooth:v0524* + ID_VENDOR_FROM_DATABASE=Hangzhou iMagic Technology Co., Ltd + +bluetooth:v0525* + ID_VENDOR_FROM_DATABASE=HONGKONG NANO IC TECHNOLOGIES CO., LIMITED + +bluetooth:v0526* + ID_VENDOR_FROM_DATABASE=Honeywell International Inc. + +bluetooth:v0527* + ID_VENDOR_FROM_DATABASE=Albrecht JUNG + +bluetooth:v0528* + ID_VENDOR_FROM_DATABASE=Lunera Lighting Inc. + +bluetooth:v0529* + ID_VENDOR_FROM_DATABASE=Lumen UAB + +bluetooth:v052A* + ID_VENDOR_FROM_DATABASE=Keynes Controls Ltd + +bluetooth:v052B* + ID_VENDOR_FROM_DATABASE=Novartis AG + +bluetooth:v052C* + ID_VENDOR_FROM_DATABASE=Geosatis SA + +bluetooth:v052D* + ID_VENDOR_FROM_DATABASE=EXFO, Inc. + +bluetooth:v052E* + ID_VENDOR_FROM_DATABASE=LEDVANCE GmbH + +bluetooth:v052F* + ID_VENDOR_FROM_DATABASE=Center ID Corp. + +bluetooth:v0530* + ID_VENDOR_FROM_DATABASE=Adolene, Inc. + +bluetooth:v0531* + ID_VENDOR_FROM_DATABASE=D&M Holdings Inc. + +bluetooth:v0532* + ID_VENDOR_FROM_DATABASE=CRESCO Wireless, Inc. + +bluetooth:v0533* + ID_VENDOR_FROM_DATABASE=Nura Operations Pty Ltd + +bluetooth:v0534* + ID_VENDOR_FROM_DATABASE=Frontiergadget, Inc. + +bluetooth:v0535* + ID_VENDOR_FROM_DATABASE=Smart Component Technologies Limited + +bluetooth:v0536* + ID_VENDOR_FROM_DATABASE=ZTR Control Systems LLC + +bluetooth:v0537* + ID_VENDOR_FROM_DATABASE=MetaLogics Corporation + +bluetooth:v0538* + ID_VENDOR_FROM_DATABASE=Medela AG + +bluetooth:v0539* + ID_VENDOR_FROM_DATABASE=OPPLE Lighting Co., Ltd + +bluetooth:v053A* + ID_VENDOR_FROM_DATABASE=Savitech Corp., + +bluetooth:v053B* + ID_VENDOR_FROM_DATABASE=prodigy + +bluetooth:v053C* + ID_VENDOR_FROM_DATABASE=Screenovate Technologies Ltd + +bluetooth:v053D* + ID_VENDOR_FROM_DATABASE=TESA SA + +bluetooth:v053E* + ID_VENDOR_FROM_DATABASE=CLIM8 LIMITED + +bluetooth:v053F* + ID_VENDOR_FROM_DATABASE=Silergy Corp + +bluetooth:v0540* + ID_VENDOR_FROM_DATABASE=SilverPlus, Inc + +bluetooth:v0541* + ID_VENDOR_FROM_DATABASE=Sharknet srl + +bluetooth:v0542* + ID_VENDOR_FROM_DATABASE=Mist Systems, Inc. + +bluetooth:v0543* + ID_VENDOR_FROM_DATABASE=MIWA LOCK CO.,Ltd + +bluetooth:v0544* + ID_VENDOR_FROM_DATABASE=OrthoSensor, Inc. + +bluetooth:v0545* + ID_VENDOR_FROM_DATABASE=Candy Hoover Group s.r.l + +bluetooth:v0546* + ID_VENDOR_FROM_DATABASE=Apexar Technologies S.A. + +bluetooth:v0547* + ID_VENDOR_FROM_DATABASE=LOGICDATA d.o.o. + +bluetooth:v0548* + ID_VENDOR_FROM_DATABASE=Knick Elektronische Messgeraete GmbH & Co. KG + +bluetooth:v0549* + ID_VENDOR_FROM_DATABASE=Smart Technologies and Investment Limited + +bluetooth:v054A* + ID_VENDOR_FROM_DATABASE=Linough Inc. + +bluetooth:v054B* + ID_VENDOR_FROM_DATABASE=Advanced Electronic Designs, Inc. + +bluetooth:v054C* + ID_VENDOR_FROM_DATABASE=Carefree Scott Fetzer Co Inc + +bluetooth:v054D* + ID_VENDOR_FROM_DATABASE=Sensome + +bluetooth:v054E* + ID_VENDOR_FROM_DATABASE=FORTRONIK storitve d.o.o. + +bluetooth:v054F* + ID_VENDOR_FROM_DATABASE=Sinnoz + +bluetooth:v0550* + ID_VENDOR_FROM_DATABASE=Versa Networks, Inc. + +bluetooth:v0551* + ID_VENDOR_FROM_DATABASE=Sylero + +bluetooth:v0552* + ID_VENDOR_FROM_DATABASE=Avempace SARL + +bluetooth:v0553* + ID_VENDOR_FROM_DATABASE=Nintendo Co., Ltd. + +bluetooth:v0554* + ID_VENDOR_FROM_DATABASE=National Instruments + +bluetooth:v0555* + ID_VENDOR_FROM_DATABASE=KROHNE Messtechnik GmbH + +bluetooth:v0556* + ID_VENDOR_FROM_DATABASE=Otodynamics Ltd + +bluetooth:v0557* + ID_VENDOR_FROM_DATABASE=Arwin Technology Limited + +bluetooth:v0558* + ID_VENDOR_FROM_DATABASE=benegear, inc. + +bluetooth:v0559* + ID_VENDOR_FROM_DATABASE=Newcon Optik + +bluetooth:v055A* + ID_VENDOR_FROM_DATABASE=CANDY HOUSE, Inc. + +bluetooth:v055B* + ID_VENDOR_FROM_DATABASE=FRANKLIN TECHNOLOGY INC + +bluetooth:v055C* + ID_VENDOR_FROM_DATABASE=Lely + +bluetooth:v055D* + ID_VENDOR_FROM_DATABASE=Valve Corporation + +bluetooth:v055E* + ID_VENDOR_FROM_DATABASE=Hekatron Vertriebs GmbH + +bluetooth:v055F* + ID_VENDOR_FROM_DATABASE=PROTECH S.A.S. DI GIRARDI ANDREA & C. + +bluetooth:v0560* + ID_VENDOR_FROM_DATABASE=Sarita CareTech APS (formerly Sarita CareTech IVS) + +bluetooth:v0561* + ID_VENDOR_FROM_DATABASE=Finder S.p.A. + +bluetooth:v0562* + ID_VENDOR_FROM_DATABASE=Thalmic Labs Inc. + +bluetooth:v0563* + ID_VENDOR_FROM_DATABASE=Steinel Vertrieb GmbH + +bluetooth:v0564* + ID_VENDOR_FROM_DATABASE=Beghelli Spa + +bluetooth:v0565* + ID_VENDOR_FROM_DATABASE=Beijing Smartspace Technologies Inc. + +bluetooth:v0566* + ID_VENDOR_FROM_DATABASE=CORE TRANSPORT TECHNOLOGIES NZ LIMITED + +bluetooth:v0567* + ID_VENDOR_FROM_DATABASE=Xiamen Everesports Goods Co., Ltd + +bluetooth:v0568* + ID_VENDOR_FROM_DATABASE=Bodyport Inc. + +bluetooth:v0569* + ID_VENDOR_FROM_DATABASE=Audionics System, INC. + +bluetooth:v056A* + ID_VENDOR_FROM_DATABASE=Flipnavi Co.,Ltd. + +bluetooth:v056B* + ID_VENDOR_FROM_DATABASE=Rion Co., Ltd. + +bluetooth:v056C* + ID_VENDOR_FROM_DATABASE=Long Range Systems, LLC + +bluetooth:v056D* + ID_VENDOR_FROM_DATABASE=Redmond Industrial Group LLC + +bluetooth:v056E* + ID_VENDOR_FROM_DATABASE=VIZPIN INC. + +bluetooth:v056F* + ID_VENDOR_FROM_DATABASE=BikeFinder AS + +bluetooth:v0570* + ID_VENDOR_FROM_DATABASE=Consumer Sleep Solutions LLC + +bluetooth:v0571* + ID_VENDOR_FROM_DATABASE=PSIKICK, INC. + +bluetooth:v0572* + ID_VENDOR_FROM_DATABASE=AntTail.com + +bluetooth:v0573* + ID_VENDOR_FROM_DATABASE=Lighting Science Group Corp. + +bluetooth:v0574* + ID_VENDOR_FROM_DATABASE=AFFORDABLE ELECTRONICS INC + +bluetooth:v0575* + ID_VENDOR_FROM_DATABASE=Integral Memroy Plc + +bluetooth:v0576* + ID_VENDOR_FROM_DATABASE=Globalstar, Inc. + +bluetooth:v0577* + ID_VENDOR_FROM_DATABASE=True Wearables, Inc. + +bluetooth:v0578* + ID_VENDOR_FROM_DATABASE=Wellington Drive Technologies Ltd + +bluetooth:v0579* + ID_VENDOR_FROM_DATABASE=Ensemble Tech Private Limited + +bluetooth:v057A* + ID_VENDOR_FROM_DATABASE=OMNI Remotes + +bluetooth:v057B* + ID_VENDOR_FROM_DATABASE=Duracell U.S. Operations Inc. + +bluetooth:v057C* + ID_VENDOR_FROM_DATABASE=Toor Technologies LLC + +bluetooth:v057D* + ID_VENDOR_FROM_DATABASE=Instinct Performance + +bluetooth:v057E* + ID_VENDOR_FROM_DATABASE=Beco, Inc + +bluetooth:v057F* + ID_VENDOR_FROM_DATABASE=Scuf Gaming International, LLC + +bluetooth:v0580* + ID_VENDOR_FROM_DATABASE=ARANZ Medical Limited + +bluetooth:v0581* + ID_VENDOR_FROM_DATABASE=LYS TECHNOLOGIES LTD + +bluetooth:v0582* + ID_VENDOR_FROM_DATABASE=Breakwall Analytics, LLC + +bluetooth:v0583* + ID_VENDOR_FROM_DATABASE=Code Blue Communications + +bluetooth:v0584* + ID_VENDOR_FROM_DATABASE=Gira Giersiepen GmbH & Co. KG + +bluetooth:v0585* + ID_VENDOR_FROM_DATABASE=Hearing Lab Technology + +bluetooth:v0586* + ID_VENDOR_FROM_DATABASE=LEGRAND + +bluetooth:v0587* + ID_VENDOR_FROM_DATABASE=Derichs GmbH + +bluetooth:v0588* + ID_VENDOR_FROM_DATABASE=ALT-TEKNIK LLC + +bluetooth:v0589* + ID_VENDOR_FROM_DATABASE=Star Technologies + +bluetooth:v058A* + ID_VENDOR_FROM_DATABASE=START TODAY CO.,LTD. + +bluetooth:v058B* + ID_VENDOR_FROM_DATABASE=Maxim Integrated Products + +bluetooth:v058C* + ID_VENDOR_FROM_DATABASE=MERCK Kommanditgesellschaft auf Aktien + +bluetooth:v058D* + ID_VENDOR_FROM_DATABASE=Jungheinrich Aktiengesellschaft + +bluetooth:v058E* + ID_VENDOR_FROM_DATABASE=Oculus VR, LLC + +bluetooth:v058F* + ID_VENDOR_FROM_DATABASE=HENDON SEMICONDUCTORS PTY LTD + +bluetooth:v0590* + ID_VENDOR_FROM_DATABASE=Pur3 Ltd + +bluetooth:v0591* + ID_VENDOR_FROM_DATABASE=Viasat Group S.p.A. + +bluetooth:v0592* + ID_VENDOR_FROM_DATABASE=IZITHERM + +bluetooth:v0593* + ID_VENDOR_FROM_DATABASE=Spaulding Clinical Research + +bluetooth:v0594* + ID_VENDOR_FROM_DATABASE=Kohler Company + +bluetooth:v0595* + ID_VENDOR_FROM_DATABASE=Inor Process AB + +bluetooth:v0596* + ID_VENDOR_FROM_DATABASE=My Smart Blinds + +bluetooth:v0597* + ID_VENDOR_FROM_DATABASE=RadioPulse Inc + +bluetooth:v0598* + ID_VENDOR_FROM_DATABASE=rapitag GmbH + +bluetooth:v0599* + ID_VENDOR_FROM_DATABASE=Lazlo326, LLC. + +bluetooth:v059A* + ID_VENDOR_FROM_DATABASE=Teledyne Lecroy, Inc. + +bluetooth:v059B* + ID_VENDOR_FROM_DATABASE=Dataflow Systems Limited + +bluetooth:v059C* + ID_VENDOR_FROM_DATABASE=Macrogiga Electronics + +bluetooth:v059D* + ID_VENDOR_FROM_DATABASE=Tandem Diabetes Care + +bluetooth:v059E* + ID_VENDOR_FROM_DATABASE=Polycom, Inc. + +bluetooth:v059F* + ID_VENDOR_FROM_DATABASE=Fisher & Paykel Healthcare + +bluetooth:v05A0* + ID_VENDOR_FROM_DATABASE=RCP Software Oy + +bluetooth:v05A1* + ID_VENDOR_FROM_DATABASE=Shanghai Xiaoyi Technology Co.,Ltd. + +bluetooth:v05A2* + ID_VENDOR_FROM_DATABASE=ADHERIUM(NZ) LIMITED + +bluetooth:v05A3* + ID_VENDOR_FROM_DATABASE=Axiomware Systems Incorporated + +bluetooth:v05A4* + ID_VENDOR_FROM_DATABASE=O. E. M. Controls, Inc. + +bluetooth:v05A5* + ID_VENDOR_FROM_DATABASE=Kiiroo BV + +bluetooth:v05A6* + ID_VENDOR_FROM_DATABASE=Telecon Mobile Limited + +bluetooth:v05A7* + ID_VENDOR_FROM_DATABASE=Sonos Inc + +bluetooth:v05A8* + ID_VENDOR_FROM_DATABASE=Tom Allebrandi Consulting + +bluetooth:v05A9* + ID_VENDOR_FROM_DATABASE=Monidor + +bluetooth:v05AA* + ID_VENDOR_FROM_DATABASE=Tramex Limited + +bluetooth:v05AB* + ID_VENDOR_FROM_DATABASE=Nofence AS + +bluetooth:v05AC* + ID_VENDOR_FROM_DATABASE=GoerTek Dynaudio Co., Ltd. + +bluetooth:v05AD* + ID_VENDOR_FROM_DATABASE=INIA + +bluetooth:v05AE* + ID_VENDOR_FROM_DATABASE=CARMATE MFG.CO.,LTD + +bluetooth:v05AF* + ID_VENDOR_FROM_DATABASE=ONvocal + +bluetooth:v05B0* + ID_VENDOR_FROM_DATABASE=NewTec GmbH + +bluetooth:v05B1* + ID_VENDOR_FROM_DATABASE=Medallion Instrumentation Systems + +bluetooth:v05B2* + ID_VENDOR_FROM_DATABASE=CAREL INDUSTRIES S.P.A. + +bluetooth:v05B3* + ID_VENDOR_FROM_DATABASE=Parabit Systems, Inc. + +bluetooth:v05B4* + ID_VENDOR_FROM_DATABASE=White Horse Scientific ltd + +bluetooth:v05B5* + ID_VENDOR_FROM_DATABASE=verisilicon + +bluetooth:v05B6* + ID_VENDOR_FROM_DATABASE=Elecs Industry Co.,Ltd. + +bluetooth:v05B7* + ID_VENDOR_FROM_DATABASE=Beijing Pinecone Electronics Co.,Ltd. + +bluetooth:v05B8* + ID_VENDOR_FROM_DATABASE=Ambystoma Labs Inc. + +bluetooth:v05B9* + ID_VENDOR_FROM_DATABASE=Suzhou Pairlink Network Technology + +bluetooth:v05BA* + ID_VENDOR_FROM_DATABASE=igloohome + +bluetooth:v05BB* + ID_VENDOR_FROM_DATABASE=Oxford Metrics plc + +bluetooth:v05BC* + ID_VENDOR_FROM_DATABASE=Leviton Mfg. Co., Inc. + +bluetooth:v05BD* + ID_VENDOR_FROM_DATABASE=ULC Robotics Inc. + +bluetooth:v05BE* + ID_VENDOR_FROM_DATABASE=RFID Global by Softwork SrL + +bluetooth:v05BF* + ID_VENDOR_FROM_DATABASE=Real-World-Systems Corporation + +bluetooth:v05C0* + ID_VENDOR_FROM_DATABASE=Nalu Medical, Inc. + +bluetooth:v05C1* + ID_VENDOR_FROM_DATABASE=P.I.Engineering + +bluetooth:v05C2* + ID_VENDOR_FROM_DATABASE=Grote Industries + +bluetooth:v05C3* + ID_VENDOR_FROM_DATABASE=Runtime, Inc. + +bluetooth:v05C4* + ID_VENDOR_FROM_DATABASE=Codecoup sp. z o.o. sp. k. + +bluetooth:v05C5* + ID_VENDOR_FROM_DATABASE=SELVE GmbH & Co. KG + +bluetooth:v05C6* + ID_VENDOR_FROM_DATABASE=Smart Animal Training Systems, LLC + +bluetooth:v05C7* + ID_VENDOR_FROM_DATABASE=Lippert Components, INC + +bluetooth:v05C8* + ID_VENDOR_FROM_DATABASE=SOMFY SAS + +bluetooth:v05C9* + ID_VENDOR_FROM_DATABASE=TBS Electronics B.V. + +bluetooth:v05CA* + ID_VENDOR_FROM_DATABASE=MHL Custom Inc + +bluetooth:v05CB* + ID_VENDOR_FROM_DATABASE=LucentWear LLC + +bluetooth:v05CC* + ID_VENDOR_FROM_DATABASE=WATTS ELECTRONICS + +bluetooth:v05CD* + ID_VENDOR_FROM_DATABASE=RJ Brands LLC + +bluetooth:v05CE* + ID_VENDOR_FROM_DATABASE=V-ZUG Ltd + +bluetooth:v05CF* + ID_VENDOR_FROM_DATABASE=Biowatch SA + +bluetooth:v05D0* + ID_VENDOR_FROM_DATABASE=Anova Applied Electronics + +bluetooth:v05D1* + ID_VENDOR_FROM_DATABASE=Lindab AB + +bluetooth:v05D2* + ID_VENDOR_FROM_DATABASE=frogblue TECHNOLOGY GmbH + +bluetooth:v05D3* + ID_VENDOR_FROM_DATABASE=Acurable Limited + +bluetooth:v05D4* + ID_VENDOR_FROM_DATABASE=LAMPLIGHT Co., Ltd. + +bluetooth:v05D5* + ID_VENDOR_FROM_DATABASE=TEGAM, Inc. + +bluetooth:v05D6* + ID_VENDOR_FROM_DATABASE=Zhuhai Jieli technology Co.,Ltd + +bluetooth:v05D7* + ID_VENDOR_FROM_DATABASE=modum.io AG + +bluetooth:v05D8* + ID_VENDOR_FROM_DATABASE=Farm Jenny LLC + +bluetooth:v05D9* + ID_VENDOR_FROM_DATABASE=Toyo Electronics Corporation + +bluetooth:v05DA* + ID_VENDOR_FROM_DATABASE=Applied Neural Research Corp + +bluetooth:v05DB* + ID_VENDOR_FROM_DATABASE=Avid Identification Systems, Inc. + +bluetooth:v05DC* + ID_VENDOR_FROM_DATABASE=Petronics Inc. + +bluetooth:v05DD* + ID_VENDOR_FROM_DATABASE=essentim GmbH + +bluetooth:v05DE* + ID_VENDOR_FROM_DATABASE=QT Medical INC. + +bluetooth:v05DF* + ID_VENDOR_FROM_DATABASE=VIRTUALCLINIC.DIRECT LIMITED + +bluetooth:v05E0* + ID_VENDOR_FROM_DATABASE=Viper Design LLC + +bluetooth:v05E1* + ID_VENDOR_FROM_DATABASE=Human, Incorporated + +bluetooth:v05E2* + ID_VENDOR_FROM_DATABASE=stAPPtronics GmbH + +bluetooth:v05E3* + ID_VENDOR_FROM_DATABASE=Elemental Machines, Inc. + +bluetooth:v05E4* + ID_VENDOR_FROM_DATABASE=Taiyo Yuden Co., Ltd + +bluetooth:v05E5* + ID_VENDOR_FROM_DATABASE=INEO ENERGY& SYSTEMS + +bluetooth:v05E6* + ID_VENDOR_FROM_DATABASE=Motion Instruments Inc. + +bluetooth:v05E7* + ID_VENDOR_FROM_DATABASE=PressurePro + +bluetooth:v05E8* + ID_VENDOR_FROM_DATABASE=COWBOY + +bluetooth:v05E9* + ID_VENDOR_FROM_DATABASE=iconmobile GmbH + +bluetooth:v05EA* + ID_VENDOR_FROM_DATABASE=ACS-Control-System GmbH + +bluetooth:v05EB* + ID_VENDOR_FROM_DATABASE=Bayerische Motoren Werke AG + +bluetooth:v05EC* + ID_VENDOR_FROM_DATABASE=Gycom Svenska AB + +bluetooth:v05ED* + ID_VENDOR_FROM_DATABASE=Fuji Xerox Co., Ltd + +bluetooth:v05EE* + ID_VENDOR_FROM_DATABASE=Glide Inc. + +bluetooth:v05EF* + ID_VENDOR_FROM_DATABASE=SIKOM AS + +bluetooth:v05F0* + ID_VENDOR_FROM_DATABASE=beken + +bluetooth:v05F1* + ID_VENDOR_FROM_DATABASE=The Linux Foundation + +bluetooth:v05F2* + ID_VENDOR_FROM_DATABASE=Try and E CO.,LTD. + +bluetooth:v05F3* + ID_VENDOR_FROM_DATABASE=SeeScan + +bluetooth:v05F4* + ID_VENDOR_FROM_DATABASE=Clearity, LLC + +bluetooth:v05F5* + ID_VENDOR_FROM_DATABASE=GS TAG + +bluetooth:v05F6* + ID_VENDOR_FROM_DATABASE=DPTechnics + +bluetooth:v05F7* + ID_VENDOR_FROM_DATABASE=TRACMO, INC. + +bluetooth:v05F8* + ID_VENDOR_FROM_DATABASE=Anki Inc. + +bluetooth:v05F9* + ID_VENDOR_FROM_DATABASE=Hagleitner Hygiene International GmbH + +bluetooth:v05FA* + ID_VENDOR_FROM_DATABASE=Konami Sports Life Co., Ltd. + +bluetooth:v05FB* + ID_VENDOR_FROM_DATABASE=Arblet Inc. + +bluetooth:v05FC* + ID_VENDOR_FROM_DATABASE=Masbando GmbH + +bluetooth:v05FD* + ID_VENDOR_FROM_DATABASE=Innoseis + +bluetooth:v05FE* + ID_VENDOR_FROM_DATABASE=Niko nv + +bluetooth:v05FF* + ID_VENDOR_FROM_DATABASE=Wellnomics Ltd + +bluetooth:v0600* + ID_VENDOR_FROM_DATABASE=iRobot Corporation + +bluetooth:v0601* + ID_VENDOR_FROM_DATABASE=Schrader Electronics + +bluetooth:v0602* + ID_VENDOR_FROM_DATABASE=Geberit International AG + +bluetooth:v0603* + ID_VENDOR_FROM_DATABASE=Fourth Evolution Inc + +bluetooth:v0604* + ID_VENDOR_FROM_DATABASE=Cell2Jack LLC + +bluetooth:v0605* + ID_VENDOR_FROM_DATABASE=FMW electronic Futterer u. Maier-Wolf OHG + +bluetooth:v0606* + ID_VENDOR_FROM_DATABASE=John Deere + +bluetooth:v0607* + ID_VENDOR_FROM_DATABASE=Rookery Technology Ltd + +bluetooth:v0608* + ID_VENDOR_FROM_DATABASE=KeySafe-Cloud + +bluetooth:v0609* + ID_VENDOR_FROM_DATABASE=BUCHI Labortechnik AG + +bluetooth:v060A* + ID_VENDOR_FROM_DATABASE=IQAir AG + +bluetooth:v060B* + ID_VENDOR_FROM_DATABASE=Triax Technologies Inc + +bluetooth:v060C* + ID_VENDOR_FROM_DATABASE=Vuzix Corporation + +bluetooth:v060D* + ID_VENDOR_FROM_DATABASE=TDK Corporation + +bluetooth:v060E* + ID_VENDOR_FROM_DATABASE=Blueair AB + +bluetooth:v060F* + ID_VENDOR_FROM_DATABASE=Signify Netherlands + +bluetooth:v0610* + ID_VENDOR_FROM_DATABASE=ADH GUARDIAN USA LLC + +bluetooth:v0611* + ID_VENDOR_FROM_DATABASE=Beurer GmbH + +bluetooth:v0612* + ID_VENDOR_FROM_DATABASE=Playfinity AS + +bluetooth:v0613* + ID_VENDOR_FROM_DATABASE=Hans Dinslage GmbH + +bluetooth:v0614* + ID_VENDOR_FROM_DATABASE=OnAsset Intelligence, Inc. + +bluetooth:v0615* + ID_VENDOR_FROM_DATABASE=INTER ACTION Corporation + +bluetooth:v0616* + ID_VENDOR_FROM_DATABASE=OS42 UG (haftungsbeschraenkt) + +bluetooth:v0617* + ID_VENDOR_FROM_DATABASE=WIZCONNECTED COMPANY LIMITED + +bluetooth:v0618* + ID_VENDOR_FROM_DATABASE=Audio-Technica Corporation + +bluetooth:v0619* + ID_VENDOR_FROM_DATABASE=Six Guys Labs, s.r.o. + +bluetooth:v061A* + ID_VENDOR_FROM_DATABASE=R.W. Beckett Corporation + +bluetooth:v061B* + ID_VENDOR_FROM_DATABASE=silex technology, inc. + +bluetooth:v061C* + ID_VENDOR_FROM_DATABASE=Univations Limited + +bluetooth:v061D* + ID_VENDOR_FROM_DATABASE=SENS Innovation ApS + +bluetooth:v061E* + ID_VENDOR_FROM_DATABASE=Diamond Kinetics, Inc. + +bluetooth:v061F* + ID_VENDOR_FROM_DATABASE=Phrame Inc. + +bluetooth:v0620* + ID_VENDOR_FROM_DATABASE=Forciot Oy + +bluetooth:v0621* + ID_VENDOR_FROM_DATABASE=Noordung d.o.o. + +bluetooth:v0622* + ID_VENDOR_FROM_DATABASE=Beam Labs, LLC + +bluetooth:v0623* + ID_VENDOR_FROM_DATABASE=Philadelphia Scientific (U.K.) Limited + +bluetooth:v0624* + ID_VENDOR_FROM_DATABASE=Biovotion AG + +bluetooth:v0625* + ID_VENDOR_FROM_DATABASE=Square Panda, Inc. + +bluetooth:v0626* + ID_VENDOR_FROM_DATABASE=Amplifico + +bluetooth:v0627* + ID_VENDOR_FROM_DATABASE=WEG S.A. + +bluetooth:v0628* + ID_VENDOR_FROM_DATABASE=Ensto Oy + +bluetooth:v0629* + ID_VENDOR_FROM_DATABASE=PHONEPE PVT LTD + +bluetooth:v062A* + ID_VENDOR_FROM_DATABASE=Lunatico Astronomia SL + +bluetooth:v062B* + ID_VENDOR_FROM_DATABASE=MinebeaMitsumi Inc. + +bluetooth:v062C* + ID_VENDOR_FROM_DATABASE=ASPion GmbH + +bluetooth:v062D* + ID_VENDOR_FROM_DATABASE=Vossloh-Schwabe Deutschland GmbH + +bluetooth:v062E* + ID_VENDOR_FROM_DATABASE=Procept + +bluetooth:v062F* + ID_VENDOR_FROM_DATABASE=ONKYO Corporation + +bluetooth:v0630* + ID_VENDOR_FROM_DATABASE=Asthrea D.O.O. + +bluetooth:v0631* + ID_VENDOR_FROM_DATABASE=Fortiori Design LLC + +bluetooth:v0632* + ID_VENDOR_FROM_DATABASE=Hugo Muller GmbH & Co KG + +bluetooth:v0633* + ID_VENDOR_FROM_DATABASE=Wangi Lai PLT + +bluetooth:v0634* + ID_VENDOR_FROM_DATABASE=Fanstel Corp + +bluetooth:v0635* + ID_VENDOR_FROM_DATABASE=Crookwood + +bluetooth:v0636* + ID_VENDOR_FROM_DATABASE=ELECTRONICA INTEGRAL DE SONIDO S.A. + +bluetooth:v0637* + ID_VENDOR_FROM_DATABASE=GiP Innovation Tools GmbH + +bluetooth:v0638* + ID_VENDOR_FROM_DATABASE=LX SOLUTIONS PTY LIMITED + +bluetooth:v0639* + ID_VENDOR_FROM_DATABASE=Shenzhen Minew Technologies Co., Ltd. + +bluetooth:v063A* + ID_VENDOR_FROM_DATABASE=Prolojik Limited + +bluetooth:v063B* + ID_VENDOR_FROM_DATABASE=Kromek Group Plc + +bluetooth:v063C* + ID_VENDOR_FROM_DATABASE=Contec Medical Systems Co., Ltd. + +bluetooth:v063D* + ID_VENDOR_FROM_DATABASE=Xradio Technology Co.,Ltd. + +bluetooth:v063E* + ID_VENDOR_FROM_DATABASE=The Indoor Lab, LLC + +bluetooth:v063F* + ID_VENDOR_FROM_DATABASE=LDL TECHNOLOGY + +bluetooth:v0640* + ID_VENDOR_FROM_DATABASE=Parkifi + +bluetooth:v0641* + ID_VENDOR_FROM_DATABASE=Revenue Collection Systems FRANCE SAS + +bluetooth:v0642* + ID_VENDOR_FROM_DATABASE=Bluetrum Technology Co.,Ltd + +bluetooth:v0643* + ID_VENDOR_FROM_DATABASE=makita corporation + +bluetooth:v0644* + ID_VENDOR_FROM_DATABASE=Apogee Instruments + +bluetooth:v0645* + ID_VENDOR_FROM_DATABASE=BM3 + +bluetooth:v0646* + ID_VENDOR_FROM_DATABASE=SGV Group Holding GmbH & Co. KG + +bluetooth:v0647* + ID_VENDOR_FROM_DATABASE=MED-EL + +bluetooth:v0648* + ID_VENDOR_FROM_DATABASE=Ultune Technologies + +bluetooth:v0649* + ID_VENDOR_FROM_DATABASE=Ryeex Technology Co.,Ltd. + +bluetooth:v064A* + ID_VENDOR_FROM_DATABASE=Open Research Institute, Inc. + +bluetooth:v064B* + ID_VENDOR_FROM_DATABASE=Scale-Tec, Ltd + +bluetooth:v064C* + ID_VENDOR_FROM_DATABASE=Zumtobel Group AG + +bluetooth:v064D* + ID_VENDOR_FROM_DATABASE=iLOQ Oy + +bluetooth:v064E* + ID_VENDOR_FROM_DATABASE=KRUXWorks Technologies Private Limited + +bluetooth:v064F* + ID_VENDOR_FROM_DATABASE=Digital Matter Pty Ltd + +bluetooth:v0650* + ID_VENDOR_FROM_DATABASE=Coravin, Inc. + +bluetooth:v0651* + ID_VENDOR_FROM_DATABASE=Stasis Labs, Inc. + +bluetooth:v0652* + ID_VENDOR_FROM_DATABASE=ITZ Innovations- und Technologiezentrum GmbH + +bluetooth:v0653* + ID_VENDOR_FROM_DATABASE=Meggitt SA + +bluetooth:v0654* + ID_VENDOR_FROM_DATABASE=Ledlenser GmbH & Co. KG + +bluetooth:v0655* + ID_VENDOR_FROM_DATABASE=Renishaw PLC + +bluetooth:v0656* + ID_VENDOR_FROM_DATABASE=ZhuHai AdvanPro Technology Company Limited + +bluetooth:v0657* + ID_VENDOR_FROM_DATABASE=Meshtronix Limited + +bluetooth:v0658* + ID_VENDOR_FROM_DATABASE=Payex Norge AS + +bluetooth:v0659* + ID_VENDOR_FROM_DATABASE=UnSeen Technologies Oy + +bluetooth:v065A* + ID_VENDOR_FROM_DATABASE=Zound Industries International AB + +bluetooth:v065B* + ID_VENDOR_FROM_DATABASE=Sesam Solutions BV + +bluetooth:v065C* + ID_VENDOR_FROM_DATABASE=PixArt Imaging Inc. + +bluetooth:v065D* + ID_VENDOR_FROM_DATABASE=Panduit Corp. + +bluetooth:v065E* + ID_VENDOR_FROM_DATABASE=Alo AB + +bluetooth:v065F* + ID_VENDOR_FROM_DATABASE=Ricoh Company Ltd + +bluetooth:v0660* + ID_VENDOR_FROM_DATABASE=RTC Industries, Inc. + +bluetooth:v0661* + ID_VENDOR_FROM_DATABASE=Mode Lighting Limited + +bluetooth:v0662* + ID_VENDOR_FROM_DATABASE=Particle Industries, Inc. + +bluetooth:v0663* + ID_VENDOR_FROM_DATABASE=Advanced Telemetry Systems, Inc. + +bluetooth:v0664* + ID_VENDOR_FROM_DATABASE=RHA TECHNOLOGIES LTD + +bluetooth:v0665* + ID_VENDOR_FROM_DATABASE=Pure International Limited + +bluetooth:v0666* + ID_VENDOR_FROM_DATABASE=WTO Werkzeug-Einrichtungen GmbH + +bluetooth:v0667* + ID_VENDOR_FROM_DATABASE=Spark Technology Labs Inc. + +bluetooth:v0668* + ID_VENDOR_FROM_DATABASE=Bleb Technology srl + +bluetooth:v0669* + ID_VENDOR_FROM_DATABASE=Livanova USA, Inc. + +bluetooth:v066A* + ID_VENDOR_FROM_DATABASE=Brady Worldwide Inc. + +bluetooth:v066B* + ID_VENDOR_FROM_DATABASE=DewertOkin GmbH + +bluetooth:v066C* + ID_VENDOR_FROM_DATABASE=Ztove ApS + +bluetooth:v066D* + ID_VENDOR_FROM_DATABASE=Venso EcoSolutions AB + +bluetooth:v066E* + ID_VENDOR_FROM_DATABASE=Eurotronik Kranj d.o.o. + +bluetooth:v066F* + ID_VENDOR_FROM_DATABASE=Hug Technology Ltd + +bluetooth:v0670* + ID_VENDOR_FROM_DATABASE=Gema Switzerland GmbH + +bluetooth:v0671* + ID_VENDOR_FROM_DATABASE=Buzz Products Ltd. + +bluetooth:v0672* + ID_VENDOR_FROM_DATABASE=Kopi + +bluetooth:v0673* + ID_VENDOR_FROM_DATABASE=Innova Ideas Limited + +bluetooth:v0674* + ID_VENDOR_FROM_DATABASE=BeSpoon + +bluetooth:v0675* + ID_VENDOR_FROM_DATABASE=Deco Enterprises, Inc. + +bluetooth:v0676* + ID_VENDOR_FROM_DATABASE=Expai Solutions Private Limited + +bluetooth:v0677* + ID_VENDOR_FROM_DATABASE=Innovation First, Inc. + +bluetooth:v0678* + ID_VENDOR_FROM_DATABASE=SABIK Offshore GmbH + +bluetooth:v0679* + ID_VENDOR_FROM_DATABASE=4iiii Innovations Inc. + +bluetooth:v067A* + ID_VENDOR_FROM_DATABASE=The Energy Conservatory, Inc. + +bluetooth:v067B* + ID_VENDOR_FROM_DATABASE=I.FARM, INC. + +bluetooth:v067C* + ID_VENDOR_FROM_DATABASE=Tile, Inc. + +bluetooth:v067D* + ID_VENDOR_FROM_DATABASE=Form Athletica Inc. + +bluetooth:v067E* + ID_VENDOR_FROM_DATABASE=MbientLab Inc + +bluetooth:v067F* + ID_VENDOR_FROM_DATABASE=NETGRID S.N.C. DI BISSOLI MATTEO, CAMPOREALE SIMONE, TOGNETTI FEDERICO + +bluetooth:v0680* + ID_VENDOR_FROM_DATABASE=Mannkind Corporation + +bluetooth:v0681* + ID_VENDOR_FROM_DATABASE=Trade FIDES a.s. + +bluetooth:v0682* + ID_VENDOR_FROM_DATABASE=Photron Limited + +bluetooth:v0683* + ID_VENDOR_FROM_DATABASE=Eltako GmbH + +bluetooth:v0684* + ID_VENDOR_FROM_DATABASE=Dermalapps, LLC + +bluetooth:v0685* + ID_VENDOR_FROM_DATABASE=Greenwald Industries + +bluetooth:v0686* + ID_VENDOR_FROM_DATABASE=inQs Co., Ltd. + +bluetooth:v0687* + ID_VENDOR_FROM_DATABASE=Cherry GmbH + +bluetooth:v0688* + ID_VENDOR_FROM_DATABASE=Amsted Digital Solutions Inc. + +bluetooth:v0689* + ID_VENDOR_FROM_DATABASE=Tacx b.v. + +bluetooth:v068A* + ID_VENDOR_FROM_DATABASE=Raytac Corporation + +bluetooth:v068B* + ID_VENDOR_FROM_DATABASE=Jiangsu Teranovo Tech Co., Ltd. + +bluetooth:v068C* + ID_VENDOR_FROM_DATABASE=Changzhou Sound Dragon Electronics and Acoustics Co., Ltd + +bluetooth:v068D* + ID_VENDOR_FROM_DATABASE=JetBeep Inc. + +bluetooth:v068E* + ID_VENDOR_FROM_DATABASE=Razer Inc. + +bluetooth:v068F* + ID_VENDOR_FROM_DATABASE=JRM Group Limited + +bluetooth:v0690* + ID_VENDOR_FROM_DATABASE=Eccrine Systems, Inc. + +bluetooth:v0691* + ID_VENDOR_FROM_DATABASE=Curie Point AB + +bluetooth:v0692* + ID_VENDOR_FROM_DATABASE=Georg Fischer AG + +bluetooth:v0693* + ID_VENDOR_FROM_DATABASE=Hach - Danaher + +bluetooth:v0694* + ID_VENDOR_FROM_DATABASE=T&A Laboratories LLC + +bluetooth:v0695* + ID_VENDOR_FROM_DATABASE=Koki Holdings Co., Ltd. + +bluetooth:v0696* + ID_VENDOR_FROM_DATABASE=Gunakar Private Limited + +bluetooth:v0697* + ID_VENDOR_FROM_DATABASE=Stemco Products Inc + +bluetooth:v0698* + ID_VENDOR_FROM_DATABASE=Wood IT Security, LLC + +bluetooth:v0699* + ID_VENDOR_FROM_DATABASE=RandomLab SAS + +bluetooth:v069A* + ID_VENDOR_FROM_DATABASE=Adero, Inc. (formerly as TrackR, Inc.) + +bluetooth:v069B* + ID_VENDOR_FROM_DATABASE=Dragonchip Limited + +bluetooth:v069C* + ID_VENDOR_FROM_DATABASE=Noomi AB + +bluetooth:v069D* + ID_VENDOR_FROM_DATABASE=Vakaros LLC + +bluetooth:v069E* + ID_VENDOR_FROM_DATABASE=Delta Electronics, Inc. + +bluetooth:v069F* + ID_VENDOR_FROM_DATABASE=FlowMotion Technologies AS + +bluetooth:v06A0* + ID_VENDOR_FROM_DATABASE=OBIQ Location Technology Inc. + +bluetooth:v06A1* + ID_VENDOR_FROM_DATABASE=Cardo Systems, Ltd + +bluetooth:v06A2* + ID_VENDOR_FROM_DATABASE=Globalworx GmbH + +bluetooth:v06A3* + ID_VENDOR_FROM_DATABASE=Nymbus, LLC + +bluetooth:v06A4* + ID_VENDOR_FROM_DATABASE=Sanyo Techno Solutions Tottori Co., Ltd. + +bluetooth:v06A5* + ID_VENDOR_FROM_DATABASE=TEKZITEL PTY LTD + +bluetooth:v06A6* + ID_VENDOR_FROM_DATABASE=Roambee Corporation + +bluetooth:v06A7* + ID_VENDOR_FROM_DATABASE=Chipsea Technologies (ShenZhen) Corp. + +bluetooth:v06A8* + ID_VENDOR_FROM_DATABASE=GD Midea Air-Conditioning Equipment Co., Ltd. + +bluetooth:v06A9* + ID_VENDOR_FROM_DATABASE=Soundmax Electronics Limited + +bluetooth:v06AA* + ID_VENDOR_FROM_DATABASE=Produal Oy + +bluetooth:v06AB* + ID_VENDOR_FROM_DATABASE=HMS Industrial Networks AB + +bluetooth:v06AC* + ID_VENDOR_FROM_DATABASE=Ingchips Technology Co., Ltd. + +bluetooth:v06AD* + ID_VENDOR_FROM_DATABASE=InnovaSea Systems Inc. + +bluetooth:v06AE* + ID_VENDOR_FROM_DATABASE=SenseQ Inc. + +bluetooth:v06AF* + ID_VENDOR_FROM_DATABASE=Shoof Technologies + +bluetooth:v06B0* + ID_VENDOR_FROM_DATABASE=BRK Brands, Inc. + +bluetooth:v06B1* + ID_VENDOR_FROM_DATABASE=SimpliSafe, Inc. + +bluetooth:v06B2* + ID_VENDOR_FROM_DATABASE=Tussock Innovation 2013 Limited + +bluetooth:v06B3* + ID_VENDOR_FROM_DATABASE=The Hablab ApS + +bluetooth:v06B4* + ID_VENDOR_FROM_DATABASE=Sencilion Oy + +bluetooth:v06B5* + ID_VENDOR_FROM_DATABASE=Wabilogic Ltd. + +bluetooth:v06B6* + ID_VENDOR_FROM_DATABASE=Sociometric Solutions, Inc. + +bluetooth:v06B7* + ID_VENDOR_FROM_DATABASE=iCOGNIZE GmbH + +bluetooth:v06B8* + ID_VENDOR_FROM_DATABASE=ShadeCraft, Inc + +bluetooth:v06B9* + ID_VENDOR_FROM_DATABASE=Beflex Inc. + +bluetooth:v06BA* + ID_VENDOR_FROM_DATABASE=Beaconzone Ltd + +bluetooth:v06BB* + ID_VENDOR_FROM_DATABASE=Leaftronix Analogic Solutions Private Limited + +bluetooth:v06BC* + ID_VENDOR_FROM_DATABASE=TWS Srl + +bluetooth:v06BD* + ID_VENDOR_FROM_DATABASE=ABB Oy + +bluetooth:v06BE* + ID_VENDOR_FROM_DATABASE=HitSeed Oy + +bluetooth:v06BF* + ID_VENDOR_FROM_DATABASE=Delcom Products Inc. + +bluetooth:v06C0* + ID_VENDOR_FROM_DATABASE=CAME S.p.A. + +bluetooth:v06C1* + ID_VENDOR_FROM_DATABASE=Alarm.com Holdings, Inc + +bluetooth:v06C2* + ID_VENDOR_FROM_DATABASE=Measurlogic Inc. + +bluetooth:v06C3* + ID_VENDOR_FROM_DATABASE=King I Electronics.Co.,Ltd + +bluetooth:v06C4* + ID_VENDOR_FROM_DATABASE=Dream Labs GmbH + +bluetooth:v06C5* + ID_VENDOR_FROM_DATABASE=Urban Compass, Inc + +bluetooth:v06C6* + ID_VENDOR_FROM_DATABASE=Simm Tronic Limited + +bluetooth:v06C7* + ID_VENDOR_FROM_DATABASE=Somatix Inc + +bluetooth:v06C8* + ID_VENDOR_FROM_DATABASE=Storz & Bickel GmbH & Co. KG + +bluetooth:v06C9* + ID_VENDOR_FROM_DATABASE=MYLAPS B.V. + +bluetooth:v06CA* + ID_VENDOR_FROM_DATABASE=Shenzhen Zhongguang Infotech Technology Development Co., Ltd + +bluetooth:v06CB* + ID_VENDOR_FROM_DATABASE=Dyeware, LLC + +bluetooth:v06CC* + ID_VENDOR_FROM_DATABASE=Dongguan SmartAction Technology Co.,Ltd. + +bluetooth:v06CD* + ID_VENDOR_FROM_DATABASE=DIG Corporation + +bluetooth:v06CE* + ID_VENDOR_FROM_DATABASE=FIOR & GENTZ + +bluetooth:v06CF* + ID_VENDOR_FROM_DATABASE=Belparts N.V. + +bluetooth:v06D0* + ID_VENDOR_FROM_DATABASE=Etekcity Corporation + +bluetooth:v06D1* + ID_VENDOR_FROM_DATABASE=Meyer Sound Laboratories, Incorporated + +bluetooth:v06D2* + ID_VENDOR_FROM_DATABASE=CeoTronics AG + +bluetooth:v06D3* + ID_VENDOR_FROM_DATABASE=TriTeq Lock and Security, LLC + +bluetooth:v06D4* + ID_VENDOR_FROM_DATABASE=DYNAKODE TECHNOLOGY PRIVATE LIMITED + +bluetooth:v06D5* + ID_VENDOR_FROM_DATABASE=Sensirion AG + +bluetooth:v06D6* + ID_VENDOR_FROM_DATABASE=JCT Healthcare Pty Ltd + +bluetooth:v06D7* + ID_VENDOR_FROM_DATABASE=FUBA Automotive Electronics GmbH + +bluetooth:v06D8* + ID_VENDOR_FROM_DATABASE=AW Company + +bluetooth:v06D9* + ID_VENDOR_FROM_DATABASE=Shanghai Mountain View Silicon Co.,Ltd. + +bluetooth:v06DA* + ID_VENDOR_FROM_DATABASE=Zliide Technologies ApS + +bluetooth:v06DB* + ID_VENDOR_FROM_DATABASE=Automatic Labs, Inc. + +bluetooth:v06DC* + ID_VENDOR_FROM_DATABASE=Industrial Network Controls, LLC + +bluetooth:v06DD* + ID_VENDOR_FROM_DATABASE=Intellithings Ltd. + +bluetooth:v06DE* + ID_VENDOR_FROM_DATABASE=Navcast, Inc. + +bluetooth:v06DF* + ID_VENDOR_FROM_DATABASE=Hubbell Lighting, Inc. + +bluetooth:v06E0* + ID_VENDOR_FROM_DATABASE=Avaya  + +bluetooth:v06E1* + ID_VENDOR_FROM_DATABASE=Milestone AV Technologies LLC + +bluetooth:v06E2* + ID_VENDOR_FROM_DATABASE=Alango Technologies Ltd + +bluetooth:v06E3* + ID_VENDOR_FROM_DATABASE=Spinlock Ltd + +bluetooth:v06E4* + ID_VENDOR_FROM_DATABASE=Aluna + +bluetooth:v06E5* + ID_VENDOR_FROM_DATABASE=OPTEX CO.,LTD. + +bluetooth:v06E6* + ID_VENDOR_FROM_DATABASE=NIHON DENGYO KOUSAKU + +bluetooth:v06E7* + ID_VENDOR_FROM_DATABASE=VELUX A/S + +bluetooth:v06E8* + ID_VENDOR_FROM_DATABASE=Almendo Technologies GmbH + +bluetooth:v06E9* + ID_VENDOR_FROM_DATABASE=Zmartfun Electronics, Inc. + +bluetooth:v06EA* + ID_VENDOR_FROM_DATABASE=SafeLine Sweden AB + +bluetooth:v06EB* + ID_VENDOR_FROM_DATABASE=Houston Radar LLC + +bluetooth:v06EC* + ID_VENDOR_FROM_DATABASE=Sigur + +bluetooth:v06ED* + ID_VENDOR_FROM_DATABASE=J Neades Ltd + +bluetooth:v06EE* + ID_VENDOR_FROM_DATABASE=Avantis Systems Limited + +bluetooth:v06EF* + ID_VENDOR_FROM_DATABASE=ALCARE Co., Ltd. + +bluetooth:v06F0* + ID_VENDOR_FROM_DATABASE=Chargy Technologies, SL + +bluetooth:v06F1* + ID_VENDOR_FROM_DATABASE=Shibutani Co., Ltd. + +bluetooth:v06F2* + ID_VENDOR_FROM_DATABASE=Trapper Data AB + +bluetooth:v06F3* + ID_VENDOR_FROM_DATABASE=Alfred International Inc. + +bluetooth:v06F4* + ID_VENDOR_FROM_DATABASE=Near Field Solutions Ltd + +bluetooth:v06F5* + ID_VENDOR_FROM_DATABASE=Vigil Technologies Inc. + +bluetooth:v06F6* + ID_VENDOR_FROM_DATABASE=Vitulo Plus BV + +bluetooth:v06F7* + ID_VENDOR_FROM_DATABASE=WILKA Schliesstechnik GmbH + +bluetooth:v06F8* + ID_VENDOR_FROM_DATABASE=BodyPlus Technology Co.,Ltd + +bluetooth:v06F9* + ID_VENDOR_FROM_DATABASE=happybrush GmbH + +bluetooth:v06FA* + ID_VENDOR_FROM_DATABASE=Enequi AB + +bluetooth:v06FB* + ID_VENDOR_FROM_DATABASE=Sartorius AG + +bluetooth:v06FC* + ID_VENDOR_FROM_DATABASE=Tom Communication Industrial Co.,Ltd. + +bluetooth:v06FD* + ID_VENDOR_FROM_DATABASE=ESS Embedded System Solutions Inc. + +bluetooth:v06FE* + ID_VENDOR_FROM_DATABASE=Mahr GmbH + +bluetooth:v06FF* + ID_VENDOR_FROM_DATABASE=Redpine Signals Inc + +bluetooth:v0700* + ID_VENDOR_FROM_DATABASE=TraqFreq LLC + +bluetooth:v0701* + ID_VENDOR_FROM_DATABASE=PAFERS TECH + +bluetooth:v0702* + ID_VENDOR_FROM_DATABASE=Akciju sabiedriba "SAF TEHNIKA" + +bluetooth:v0703* + ID_VENDOR_FROM_DATABASE=Beijing Jingdong Century Trading Co., Ltd. + +bluetooth:v0704* + ID_VENDOR_FROM_DATABASE=JBX Designs Inc. + +bluetooth:v0705* + ID_VENDOR_FROM_DATABASE=AB Electrolux + +bluetooth:v0706* + ID_VENDOR_FROM_DATABASE=Wernher von Braun Center for ASdvanced Research + +bluetooth:v0707* + ID_VENDOR_FROM_DATABASE=Essity Hygiene and Health Aktiebolag + +bluetooth:v0708* + ID_VENDOR_FROM_DATABASE=Be Interactive Co., Ltd + +bluetooth:v0709* + ID_VENDOR_FROM_DATABASE=Carewear Corp. + +bluetooth:v070A* + ID_VENDOR_FROM_DATABASE=Huf Hülsbeck & Fürst GmbH & Co. KG + +bluetooth:v070B* + ID_VENDOR_FROM_DATABASE=Element Products, Inc. + +bluetooth:v070C* + ID_VENDOR_FROM_DATABASE=Beijing Winner Microelectronics Co.,Ltd + +bluetooth:v070D* + ID_VENDOR_FROM_DATABASE=SmartSnugg Pty Ltd + +bluetooth:v070E* + ID_VENDOR_FROM_DATABASE=FiveCo Sarl + +bluetooth:v070F* + ID_VENDOR_FROM_DATABASE=California Things Inc. + +bluetooth:v0710* + ID_VENDOR_FROM_DATABASE=Audiodo AB + +bluetooth:v0711* + ID_VENDOR_FROM_DATABASE=ABAX AS + +bluetooth:v0712* + ID_VENDOR_FROM_DATABASE=Bull Group Company Limited + +bluetooth:v0713* + ID_VENDOR_FROM_DATABASE=Respiri Limited + +bluetooth:v0714* + ID_VENDOR_FROM_DATABASE=MindPeace Safety LLC + +bluetooth:v0715* + ID_VENDOR_FROM_DATABASE=Vgyan Solutions + +bluetooth:v0716* + ID_VENDOR_FROM_DATABASE=Altonics + +bluetooth:v0717* + ID_VENDOR_FROM_DATABASE=iQsquare BV + +bluetooth:v0718* + ID_VENDOR_FROM_DATABASE=IDIBAIX enginneering + +bluetooth:v0719* + ID_VENDOR_FROM_DATABASE=ECSG + +bluetooth:v071A* + ID_VENDOR_FROM_DATABASE=REVSMART WEARABLE HK CO LTD + +bluetooth:v071B* + ID_VENDOR_FROM_DATABASE=Precor + +bluetooth:v071C* + ID_VENDOR_FROM_DATABASE=F5 Sports, Inc + +bluetooth:v071D* + ID_VENDOR_FROM_DATABASE=exoTIC Systems + +bluetooth:v071E* + ID_VENDOR_FROM_DATABASE=DONGGUAN HELE ELECTRONICS CO., LTD + +bluetooth:v071F* + ID_VENDOR_FROM_DATABASE=Dongguan Liesheng Electronic Co.Ltd + +bluetooth:v0720* + ID_VENDOR_FROM_DATABASE=Oculeve, Inc. + +bluetooth:v0721* + ID_VENDOR_FROM_DATABASE=Clover Network, Inc. + +bluetooth:v0722* + ID_VENDOR_FROM_DATABASE=Xiamen Eholder Electronics Co.Ltd + +bluetooth:v0723* + ID_VENDOR_FROM_DATABASE=Ford Motor Company + +bluetooth:v0724* + ID_VENDOR_FROM_DATABASE=Guangzhou SuperSound Information Technology Co.,Ltd + +bluetooth:v0725* + ID_VENDOR_FROM_DATABASE=Tedee Sp. z o.o. + +bluetooth:v0726* + ID_VENDOR_FROM_DATABASE=PHC Corporation + +bluetooth:v0727* + ID_VENDOR_FROM_DATABASE=STALKIT AS + +bluetooth:v0728* + ID_VENDOR_FROM_DATABASE=Eli Lilly and Company + +bluetooth:v0729* + ID_VENDOR_FROM_DATABASE=SwaraLink Technologies + +bluetooth:v072A* + ID_VENDOR_FROM_DATABASE=JMR embedded systems GmbH + +bluetooth:v072B* + ID_VENDOR_FROM_DATABASE=Bitkey Inc. + +bluetooth:v072C* + ID_VENDOR_FROM_DATABASE=GWA Hygiene GmbH + +bluetooth:v072D* + ID_VENDOR_FROM_DATABASE=Safera Oy + +bluetooth:v072E* + ID_VENDOR_FROM_DATABASE=Open Platform Systems LLC + +bluetooth:v072F* + ID_VENDOR_FROM_DATABASE=OnePlus Electronics (Shenzhen) Co., Ltd. + +bluetooth:v0730* + ID_VENDOR_FROM_DATABASE=Wildlife Acoustics, Inc. + +bluetooth:v0731* + ID_VENDOR_FROM_DATABASE=ABLIC Inc. + +bluetooth:v0732* + ID_VENDOR_FROM_DATABASE=Dairy Tech, Inc. + +bluetooth:v0733* + ID_VENDOR_FROM_DATABASE=Iguanavation, Inc. + +bluetooth:v0734* + ID_VENDOR_FROM_DATABASE=DiUS Computing Pty Ltd + +bluetooth:v0735* + ID_VENDOR_FROM_DATABASE=UpRight Technologies LTD + +bluetooth:v0736* + ID_VENDOR_FROM_DATABASE=FrancisFund, LLC + +bluetooth:v0737* + ID_VENDOR_FROM_DATABASE=LLC Navitek + +bluetooth:v0738* + ID_VENDOR_FROM_DATABASE=Glass Security Pte Ltd + +bluetooth:v0739* + ID_VENDOR_FROM_DATABASE=Jiangsu Qinheng Co., Ltd. + +bluetooth:v073A* + ID_VENDOR_FROM_DATABASE=Chandler Systems Inc. + +bluetooth:v073B* + ID_VENDOR_FROM_DATABASE=Fantini Cosmi s.p.a. + +bluetooth:v073C* + ID_VENDOR_FROM_DATABASE=Acubit ApS + +bluetooth:v073D* + ID_VENDOR_FROM_DATABASE=Beijing Hao Heng Tian Tech Co., Ltd. + +bluetooth:v073E* + ID_VENDOR_FROM_DATABASE=Bluepack S.R.L. + +bluetooth:v073F* + ID_VENDOR_FROM_DATABASE=Beijing Unisoc Technologies Co., Ltd. + +bluetooth:v0740* + ID_VENDOR_FROM_DATABASE=HITIQ LIMITED + +bluetooth:v0741* + ID_VENDOR_FROM_DATABASE=MAC SRL + +bluetooth:v0742* + ID_VENDOR_FROM_DATABASE=DML LLC + +bluetooth:v0743* + ID_VENDOR_FROM_DATABASE=Sanofi + +bluetooth:v0744* + ID_VENDOR_FROM_DATABASE=SOCOMEC + +bluetooth:v0745* + ID_VENDOR_FROM_DATABASE=WIZNOVA, Inc. + +bluetooth:v0746* + ID_VENDOR_FROM_DATABASE=Seitec Elektronik GmbH + +bluetooth:v0747* + ID_VENDOR_FROM_DATABASE=OR Technologies Pty Ltd + +bluetooth:v0748* + ID_VENDOR_FROM_DATABASE=GuangZhou KuGou Computer Technology Co.Ltd + +bluetooth:v0749* + ID_VENDOR_FROM_DATABASE=DIAODIAO (Beijing) Technology Co., Ltd. + +bluetooth:v074A* + ID_VENDOR_FROM_DATABASE=Illusory Studios LLC + +bluetooth:v074B* + ID_VENDOR_FROM_DATABASE=Sarvavid Software Solutions LLP + +bluetooth:v074C* + ID_VENDOR_FROM_DATABASE=iopool s.a. + +bluetooth:v074D* + ID_VENDOR_FROM_DATABASE=Amtech Systems, LLC + +bluetooth:v074E* + ID_VENDOR_FROM_DATABASE=EAGLE DETECTION SA + +bluetooth:v074F* + ID_VENDOR_FROM_DATABASE=MEDIATECH S.R.L. + +bluetooth:v0750* + ID_VENDOR_FROM_DATABASE=Hamilton Professional Services of Canada Incorporated + +bluetooth:v0751* + ID_VENDOR_FROM_DATABASE=Changsha JEMO IC Design Co.,Ltd + +bluetooth:v0752* + ID_VENDOR_FROM_DATABASE=Elatec GmbH + +bluetooth:v0753* + ID_VENDOR_FROM_DATABASE=JLG Industries, Inc. + +bluetooth:v0754* + ID_VENDOR_FROM_DATABASE=Michael Parkin + +bluetooth:v0755* + ID_VENDOR_FROM_DATABASE=Brother Industries, Ltd + +bluetooth:v0756* + ID_VENDOR_FROM_DATABASE=Lumens For Less, Inc + +bluetooth:v0757* + ID_VENDOR_FROM_DATABASE=ELA Innovation + +bluetooth:v0758* + ID_VENDOR_FROM_DATABASE=umanSense AB + +bluetooth:v0759* + ID_VENDOR_FROM_DATABASE=Shanghai InGeek Cyber Security Co., Ltd. + +bluetooth:v075A* + ID_VENDOR_FROM_DATABASE=HARMAN CO.,LTD. + +bluetooth:v075B* + ID_VENDOR_FROM_DATABASE=Smart Sensor Devices AB + +bluetooth:v075C* + ID_VENDOR_FROM_DATABASE=Antitronics Inc. + +bluetooth:v075D* + ID_VENDOR_FROM_DATABASE=RHOMBUS SYSTEMS, INC. + +bluetooth:v075E* + ID_VENDOR_FROM_DATABASE=Katerra Inc. + +bluetooth:v075F* + ID_VENDOR_FROM_DATABASE=Remote Solution Co., LTD. + +bluetooth:v0760* + ID_VENDOR_FROM_DATABASE=Vimar SpA + +bluetooth:v0761* + ID_VENDOR_FROM_DATABASE=Mantis Tech LLC + +bluetooth:v0762* + ID_VENDOR_FROM_DATABASE=TerOpta Ltd + +bluetooth:v0763* + ID_VENDOR_FROM_DATABASE=PIKOLIN S.L. + +bluetooth:v0764* + ID_VENDOR_FROM_DATABASE=WWZN Information Technology Company Limited + +bluetooth:v0765* + ID_VENDOR_FROM_DATABASE=Voxx International + +bluetooth:v0766* + ID_VENDOR_FROM_DATABASE=ART AND PROGRAM, INC. + +bluetooth:v0767* + ID_VENDOR_FROM_DATABASE=NITTO DENKO ASIA TECHNICAL CENTRE PTE. LTD. + +bluetooth:v0768* + ID_VENDOR_FROM_DATABASE=Peloton Interactive Inc. + +bluetooth:v0769* + ID_VENDOR_FROM_DATABASE=Force Impact Technologies + +bluetooth:v076A* + ID_VENDOR_FROM_DATABASE=Dmac Mobile Developments, LLC + +bluetooth:v076B* + ID_VENDOR_FROM_DATABASE=Engineered Medical Technologies + +bluetooth:v076C* + ID_VENDOR_FROM_DATABASE=Noodle Technology inc + +bluetooth:v076D* + ID_VENDOR_FROM_DATABASE=Graesslin GmbH + +bluetooth:v076E* + ID_VENDOR_FROM_DATABASE=WuQi technologies, Inc. + +bluetooth:v076F* + ID_VENDOR_FROM_DATABASE=Successful Endeavours Pty Ltd + +bluetooth:v0770* + ID_VENDOR_FROM_DATABASE=InnoCon Medical ApS + +bluetooth:v0771* + ID_VENDOR_FROM_DATABASE=Corvex Connected Safety + +bluetooth:v0772* + ID_VENDOR_FROM_DATABASE=Thirdwayv Inc. + +bluetooth:v0773* + ID_VENDOR_FROM_DATABASE=Echoflex Solutions Inc. + +bluetooth:v0774* + ID_VENDOR_FROM_DATABASE=C-MAX Asia Limited + +bluetooth:v0775* + ID_VENDOR_FROM_DATABASE=4eBusiness GmbH + +bluetooth:v0776* + ID_VENDOR_FROM_DATABASE=Cyber Transport Control GmbH + +bluetooth:v0777* + ID_VENDOR_FROM_DATABASE=Cue + +bluetooth:v0778* + ID_VENDOR_FROM_DATABASE=KOAMTAC INC. + +bluetooth:v0779* + ID_VENDOR_FROM_DATABASE=Loopshore Oy + +bluetooth:v077A* + ID_VENDOR_FROM_DATABASE=Niruha Systems Private Limited + +bluetooth:v077B* + ID_VENDOR_FROM_DATABASE=AmaterZ, Inc. + +bluetooth:v077C* + ID_VENDOR_FROM_DATABASE=radius co., ltd. + +bluetooth:v077D* + ID_VENDOR_FROM_DATABASE=Sensority, s.r.o. + +bluetooth:v077E* + ID_VENDOR_FROM_DATABASE=Sparkage Inc. + +bluetooth:v077F* + ID_VENDOR_FROM_DATABASE=Glenview Software Corporation + +bluetooth:v0780* + ID_VENDOR_FROM_DATABASE=Finch Technologies Ltd. + +bluetooth:v0781* + ID_VENDOR_FROM_DATABASE=Qingping Technology (Beijing) Co., Ltd. + +bluetooth:v0782* + ID_VENDOR_FROM_DATABASE=DeviceDrive AS + +bluetooth:v0783* + ID_VENDOR_FROM_DATABASE=ESEMBER LIMITED LIABILITY COMPANY + +bluetooth:v0784* + ID_VENDOR_FROM_DATABASE=audifon GmbH & Co. KG + +bluetooth:v0785* + ID_VENDOR_FROM_DATABASE=O2 Micro, Inc. + +bluetooth:v0786* + ID_VENDOR_FROM_DATABASE=HLP Controls Pty Limited + +bluetooth:v0787* + ID_VENDOR_FROM_DATABASE=Pangaea Solution + +bluetooth:v0788* + ID_VENDOR_FROM_DATABASE=BubblyNet, LLC + +bluetooth:v078A* + ID_VENDOR_FROM_DATABASE=The Wildflower Foundation + +bluetooth:v078B* + ID_VENDOR_FROM_DATABASE=Optikam Tech Inc. + +bluetooth:v078C* + ID_VENDOR_FROM_DATABASE=MINIBREW HOLDING B.V + +bluetooth:v078D* + ID_VENDOR_FROM_DATABASE=Cybex GmbH + +bluetooth:v078E* + ID_VENDOR_FROM_DATABASE=FUJIMIC NIIGATA, INC. + +bluetooth:v078F* + ID_VENDOR_FROM_DATABASE=Hanna Instruments, Inc. + +bluetooth:v0790* + ID_VENDOR_FROM_DATABASE=KOMPAN A/S + +bluetooth:v0791* + ID_VENDOR_FROM_DATABASE=Scosche Industries, Inc. + +bluetooth:v0792* + ID_VENDOR_FROM_DATABASE=Provo Craft + +bluetooth:v0793* + ID_VENDOR_FROM_DATABASE=AEV spol. s r.o. + +bluetooth:v0794* + ID_VENDOR_FROM_DATABASE=The Coca-Cola Company + +bluetooth:v0795* + ID_VENDOR_FROM_DATABASE=GASTEC CORPORATION + +bluetooth:v0796* + ID_VENDOR_FROM_DATABASE=StarLeaf Ltd + +bluetooth:v0797* + ID_VENDOR_FROM_DATABASE=Water-i.d. GmbH + +bluetooth:v0798* + ID_VENDOR_FROM_DATABASE=HoloKit, Inc. + +bluetooth:v0799* + ID_VENDOR_FROM_DATABASE=PlantChoir Inc. + +bluetooth:v079A* + ID_VENDOR_FROM_DATABASE=GuangDong Oppo Mobile Telecommunications Corp., Ltd. + +bluetooth:v079B* + ID_VENDOR_FROM_DATABASE=CST ELECTRONICS (PROPRIETARY) LIMITED + +bluetooth:v079C* + ID_VENDOR_FROM_DATABASE=Sky UK Limited + +bluetooth:v079D* + ID_VENDOR_FROM_DATABASE=Digibale Pty Ltd + +bluetooth:v079E* + ID_VENDOR_FROM_DATABASE=Smartloxx GmbH + +bluetooth:v079F* + ID_VENDOR_FROM_DATABASE=Pune Scientific LLP + +bluetooth:v07A0* + ID_VENDOR_FROM_DATABASE=Regent Beleuchtungskorper AG + +bluetooth:v07A1* + ID_VENDOR_FROM_DATABASE=Apollo Neuroscience, Inc. + +bluetooth:v07A2* + ID_VENDOR_FROM_DATABASE=Roku, Inc. + +bluetooth:v07A3* + ID_VENDOR_FROM_DATABASE=Comcast Cable + +bluetooth:v07A4* + ID_VENDOR_FROM_DATABASE=Xiamen Mage Information Technology Co., Ltd. + +bluetooth:v07A5* + ID_VENDOR_FROM_DATABASE=RAB Lighting, Inc. + +bluetooth:v07A6* + ID_VENDOR_FROM_DATABASE=Musen Connect, Inc. + +bluetooth:v07A7* + ID_VENDOR_FROM_DATABASE=Zume, Inc. + +bluetooth:v07A8* + ID_VENDOR_FROM_DATABASE=conbee GmbH + +bluetooth:v07A9* + ID_VENDOR_FROM_DATABASE=Bruel & Kjaer Sound & Vibration + +bluetooth:v07AA* + ID_VENDOR_FROM_DATABASE=The Kroger Co. + +bluetooth:v07AB* + ID_VENDOR_FROM_DATABASE=Granite River Solutions, Inc. + +bluetooth:v07AC* + ID_VENDOR_FROM_DATABASE=LoupeDeck Oy + +bluetooth:v07AD* + ID_VENDOR_FROM_DATABASE=New H3C Technologies Co.,Ltd + +bluetooth:v07AE* + ID_VENDOR_FROM_DATABASE=Aurea Solucoes Tecnologicas Ltda. + +bluetooth:v07AF* + ID_VENDOR_FROM_DATABASE=Hong Kong Bouffalo Lab Limited + +bluetooth:v07B0* + ID_VENDOR_FROM_DATABASE=GV Concepts Inc. + +bluetooth:v07B1* + ID_VENDOR_FROM_DATABASE=Thomas Dynamics, LLC + +bluetooth:v07B2* + ID_VENDOR_FROM_DATABASE=Moeco IOT Inc. + +bluetooth:v07B3* + ID_VENDOR_FROM_DATABASE=2N TELEKOMUNIKACE a.s. + +bluetooth:v07B4* + ID_VENDOR_FROM_DATABASE=Hormann KG Antriebstechnik + +bluetooth:v07B5* + ID_VENDOR_FROM_DATABASE=CRONO CHIP, S.L. + +bluetooth:v07B6* + ID_VENDOR_FROM_DATABASE=Soundbrenner Limited + +bluetooth:v07B7* + ID_VENDOR_FROM_DATABASE=ETABLISSEMENTS GEORGES RENAULT + +bluetooth:v07B8* + ID_VENDOR_FROM_DATABASE=iSwip + +bluetooth:v07B9* + ID_VENDOR_FROM_DATABASE=Epona Biotec Limited + +bluetooth:v07BA* + ID_VENDOR_FROM_DATABASE=Battery-Biz Inc. + +bluetooth:v07BB* + ID_VENDOR_FROM_DATABASE=EPIC S.R.L. + +bluetooth:v07BC* + ID_VENDOR_FROM_DATABASE=KD CIRCUITS LLC + +bluetooth:v07BD* + ID_VENDOR_FROM_DATABASE=Genedrive Diagnostics Ltd + +bluetooth:v07BE* + ID_VENDOR_FROM_DATABASE=Axentia Technologies AB + +bluetooth:v07BF* + ID_VENDOR_FROM_DATABASE=REGULA Ltd. + +bluetooth:v07C0* + ID_VENDOR_FROM_DATABASE=Biral AG + +bluetooth:v07C1* + ID_VENDOR_FROM_DATABASE=A.W. Chesterton Company + +bluetooth:v07C2* + ID_VENDOR_FROM_DATABASE=Radinn AB + +bluetooth:v07C3* + ID_VENDOR_FROM_DATABASE=CIMTechniques, Inc. + +bluetooth:v07C4* + ID_VENDOR_FROM_DATABASE=Johnson Health Tech NA + +bluetooth:v07C5* + ID_VENDOR_FROM_DATABASE=June Life, Inc. + +bluetooth:v07C6* + ID_VENDOR_FROM_DATABASE=Bluenetics GmbH + +bluetooth:v07C7* + ID_VENDOR_FROM_DATABASE=iaconicDesign Inc. + +bluetooth:v07C8* + ID_VENDOR_FROM_DATABASE=WRLDS Creations AB + +bluetooth:v07C9* + ID_VENDOR_FROM_DATABASE=Skullcandy, Inc. + +bluetooth:v07CA* + ID_VENDOR_FROM_DATABASE=Modul-System HH AB + +bluetooth:v07CB* + ID_VENDOR_FROM_DATABASE=West Pharmaceutical Services, Inc. + +bluetooth:v07CC* + ID_VENDOR_FROM_DATABASE=Barnacle Systems Inc. + +bluetooth:v07CD* + ID_VENDOR_FROM_DATABASE=Smart Wave Technologies Canada Inc + +bluetooth:v07CE* + ID_VENDOR_FROM_DATABASE=Shanghai Top-Chip Microelectronics Tech. Co., LTD + +bluetooth:v07CF* + ID_VENDOR_FROM_DATABASE=NeoSensory, Inc. + +bluetooth:v07D0* + ID_VENDOR_FROM_DATABASE=Hangzhou Tuya Information Technology Co., Ltd + +bluetooth:v07D1* + ID_VENDOR_FROM_DATABASE=Shanghai Panchip Microelectronics Co., Ltd + +bluetooth:v07D2* + ID_VENDOR_FROM_DATABASE=React Accessibility Limited + +bluetooth:v07D3* + ID_VENDOR_FROM_DATABASE=LIVNEX Co.,Ltd. + +bluetooth:v07D4* + ID_VENDOR_FROM_DATABASE=Kano Computing Limited + +bluetooth:v07D5* + ID_VENDOR_FROM_DATABASE=hoots classic GmbH + +bluetooth:v07D6* + ID_VENDOR_FROM_DATABASE=ecobee Inc. + +bluetooth:v07D7* + ID_VENDOR_FROM_DATABASE=Nanjing Qinheng Microelectronics Co., Ltd + +bluetooth:v07D8* + ID_VENDOR_FROM_DATABASE=SOLUTIONS AMBRA INC. + +bluetooth:v07D9* + ID_VENDOR_FROM_DATABASE=Micro-Design, Inc. + +bluetooth:v07DA* + ID_VENDOR_FROM_DATABASE=STARLITE Co., Ltd. + +bluetooth:v07DB* + ID_VENDOR_FROM_DATABASE=Remedee Labs + +bluetooth:v07DC* + ID_VENDOR_FROM_DATABASE=ThingOS GmbH + +bluetooth:v07DD* + ID_VENDOR_FROM_DATABASE=Linear Circuits + +bluetooth:v07DE* + ID_VENDOR_FROM_DATABASE=Unlimited Engineering SL + +bluetooth:v07DF* + ID_VENDOR_FROM_DATABASE=Snap-on Incorporated + +bluetooth:v07E0* + ID_VENDOR_FROM_DATABASE=Edifier International Limited + +bluetooth:v07E1* + ID_VENDOR_FROM_DATABASE=Lucie Labs + +bluetooth:v07E2* + ID_VENDOR_FROM_DATABASE=Alfred Kaercher SE & Co. KG + +bluetooth:v07E3* + ID_VENDOR_FROM_DATABASE=Audiowise Technology Inc. + +bluetooth:v07E4* + ID_VENDOR_FROM_DATABASE=Geeksme S.L. + +bluetooth:v07E5* + ID_VENDOR_FROM_DATABASE=Minut, Inc. + +bluetooth:v07E6* + ID_VENDOR_FROM_DATABASE=Autogrow Systems Limited + +bluetooth:v07E7* + ID_VENDOR_FROM_DATABASE=Komfort IQ, Inc. + +bluetooth:v07E8* + ID_VENDOR_FROM_DATABASE=Packetcraft, Inc. + +bluetooth:v07E9* + ID_VENDOR_FROM_DATABASE=Häfele GmbH & Co KG + +bluetooth:v07EA* + ID_VENDOR_FROM_DATABASE=ShapeLog, Inc. + +bluetooth:v07EB* + ID_VENDOR_FROM_DATABASE=NOVABASE S.R.L. + +bluetooth:v07EC* + ID_VENDOR_FROM_DATABASE=Frecce LLC + +bluetooth:v07ED* + ID_VENDOR_FROM_DATABASE=Joule IQ, INC. + +bluetooth:v07EE* + ID_VENDOR_FROM_DATABASE=KidzTek LLC + +bluetooth:v07EF* + ID_VENDOR_FROM_DATABASE=Aktiebolaget Sandvik Coromant + +bluetooth:v07F0* + ID_VENDOR_FROM_DATABASE=e-moola.com Pty Ltd + +bluetooth:v07F1* + ID_VENDOR_FROM_DATABASE=GSM Innovations Pty Ltd + +bluetooth:v07F2* + ID_VENDOR_FROM_DATABASE=SERENE GROUP, INC + +bluetooth:v07F3* + ID_VENDOR_FROM_DATABASE=DIGISINE ENERGYTECH CO. LTD. + +bluetooth:v07F4* + ID_VENDOR_FROM_DATABASE=MEDIRLAB Orvosbiologiai Fejleszto Korlatolt Felelossegu Tarsasag + +bluetooth:v07F5* + ID_VENDOR_FROM_DATABASE=Byton North America Corporation + +bluetooth:v07F6* + ID_VENDOR_FROM_DATABASE=Shenzhen TonliScience and Technology Development Co.,Ltd + +bluetooth:v07F7* + ID_VENDOR_FROM_DATABASE=Cesar Systems Ltd. + +bluetooth:v07F8* + ID_VENDOR_FROM_DATABASE=quip NYC Inc. + +bluetooth:v07F9* + ID_VENDOR_FROM_DATABASE=Direct Communication Solutions, Inc. + +bluetooth:v07FA* + ID_VENDOR_FROM_DATABASE=Klipsch Group, Inc. + +bluetooth:v07FB* + ID_VENDOR_FROM_DATABASE=Access Co., Ltd + +bluetooth:v07FC* + ID_VENDOR_FROM_DATABASE=Renault SA + +bluetooth:v07FD* + ID_VENDOR_FROM_DATABASE=JSK CO., LTD. + +bluetooth:v07FE* + ID_VENDOR_FROM_DATABASE=BIROTA + +bluetooth:v07FF* + ID_VENDOR_FROM_DATABASE=maxon motor ltd. + +bluetooth:v0800* + ID_VENDOR_FROM_DATABASE=Optek + +bluetooth:v0801* + ID_VENDOR_FROM_DATABASE=CRONUS ELECTRONICS LTD + +bluetooth:v0802* + ID_VENDOR_FROM_DATABASE=NantSound, Inc. + +bluetooth:v0803* + ID_VENDOR_FROM_DATABASE=Domintell s.a. + +bluetooth:v0804* + ID_VENDOR_FROM_DATABASE=Andon Health Co.,Ltd + +bluetooth:v0805* + ID_VENDOR_FROM_DATABASE=Urbanminded Ltd + +bluetooth:v0806* + ID_VENDOR_FROM_DATABASE=TYRI Sweden AB + +bluetooth:v0807* + ID_VENDOR_FROM_DATABASE=ECD Electronic Components GmbH Dresden + +bluetooth:v0808* + ID_VENDOR_FROM_DATABASE=SISTEMAS KERN, SOCIEDAD ANÓMINA + +bluetooth:v0809* + ID_VENDOR_FROM_DATABASE=Trulli Audio + +bluetooth:v080A* + ID_VENDOR_FROM_DATABASE=Altaneos + +bluetooth:v080B* + ID_VENDOR_FROM_DATABASE=Nanoleaf Canada Limited + +bluetooth:v080C* + ID_VENDOR_FROM_DATABASE=Ingy B.V. + +bluetooth:v080D* + ID_VENDOR_FROM_DATABASE=Azbil Co. + +bluetooth:v080E* + ID_VENDOR_FROM_DATABASE=TATTCOM LLC + +bluetooth:v080F* + ID_VENDOR_FROM_DATABASE=Paradox Engineering SA + +bluetooth:v0810* + ID_VENDOR_FROM_DATABASE=LECO Corporation + +bluetooth:v0811* + ID_VENDOR_FROM_DATABASE=Becker Antriebe GmbH + +bluetooth:v0812* + ID_VENDOR_FROM_DATABASE=Mstream Technologies., Inc. + +bluetooth:v0813* + ID_VENDOR_FROM_DATABASE=Flextronics International USA Inc. + +bluetooth:v0814* + ID_VENDOR_FROM_DATABASE=Ossur hf. + +bluetooth:v0815* + ID_VENDOR_FROM_DATABASE=SKC Inc + +bluetooth:v0816* + ID_VENDOR_FROM_DATABASE=SPICA SYSTEMS LLC + +bluetooth:v0817* + ID_VENDOR_FROM_DATABASE=Wangs Alliance Corporation + +bluetooth:v0818* + ID_VENDOR_FROM_DATABASE=tatwah SA + +bluetooth:v0819* + ID_VENDOR_FROM_DATABASE=Hunter Douglas Inc + +bluetooth:v081A* + ID_VENDOR_FROM_DATABASE=Shenzhen Conex + +bluetooth:v081B* + ID_VENDOR_FROM_DATABASE=DIM3 + +bluetooth:v081C* + ID_VENDOR_FROM_DATABASE=Bobrick Washroom Equipment, Inc. + +bluetooth:v081D* + ID_VENDOR_FROM_DATABASE=Potrykus Holdings and Development LLC + +bluetooth:v081E* + ID_VENDOR_FROM_DATABASE=iNFORM Technology GmbH + +bluetooth:v081F* + ID_VENDOR_FROM_DATABASE=eSenseLab LTD + +bluetooth:v0820* + ID_VENDOR_FROM_DATABASE=Brilliant Home Technology, Inc. + +bluetooth:v0821* + ID_VENDOR_FROM_DATABASE=INOVA Geophysical, Inc. + +bluetooth:v0822* + ID_VENDOR_FROM_DATABASE=adafruit industries + +bluetooth:v0823* + ID_VENDOR_FROM_DATABASE=Nexite Ltd + +bluetooth:v0824* + ID_VENDOR_FROM_DATABASE=8Power Limited + +bluetooth:v0825* + ID_VENDOR_FROM_DATABASE=CME PTE. LTD. + +bluetooth:v0826* + ID_VENDOR_FROM_DATABASE=Hyundai Motor Company + +bluetooth:v0827* + ID_VENDOR_FROM_DATABASE=Kickmaker + +bluetooth:v0828* + ID_VENDOR_FROM_DATABASE=Shanghai Suisheng Information Technology Co., Ltd. + +bluetooth:v0829* + ID_VENDOR_FROM_DATABASE=HEXAGON + +bluetooth:v082A* + ID_VENDOR_FROM_DATABASE=Mitutoyo Corporation + +bluetooth:v082B* + ID_VENDOR_FROM_DATABASE=shenzhen fitcare electronics Co.,Ltd + +bluetooth:v082C* + ID_VENDOR_FROM_DATABASE=INGICS TECHNOLOGY CO., LTD. + +bluetooth:v082D* + ID_VENDOR_FROM_DATABASE=INCUS PERFORMANCE LTD. + +bluetooth:v082E* + ID_VENDOR_FROM_DATABASE=ABB S.p.A. + +bluetooth:v082F* + ID_VENDOR_FROM_DATABASE=Blippit AB + +bluetooth:v0830* + ID_VENDOR_FROM_DATABASE=Core Health and Fitness LLC + +bluetooth:v0831* + ID_VENDOR_FROM_DATABASE=Foxble, LLC + +bluetooth:v0832* + ID_VENDOR_FROM_DATABASE=Intermotive,Inc. + +bluetooth:v0833* + ID_VENDOR_FROM_DATABASE=Conneqtech B.V. + +bluetooth:v0834* + ID_VENDOR_FROM_DATABASE=RIKEN KEIKI CO., LTD., + +bluetooth:v0835* + ID_VENDOR_FROM_DATABASE=Canopy Growth Corporation + +bluetooth:v0836* + ID_VENDOR_FROM_DATABASE=Bitwards Oy + +bluetooth:v0837* + ID_VENDOR_FROM_DATABASE=vivo Mobile Communication Co., Ltd. + +bluetooth:v0838* + ID_VENDOR_FROM_DATABASE=Etymotic Research, Inc. + +bluetooth:v0839* + ID_VENDOR_FROM_DATABASE=A puissance 3 + +bluetooth:v083A* + ID_VENDOR_FROM_DATABASE=BPW Bergische Achsen Kommanditgesellschaft + +bluetooth:v083B* + ID_VENDOR_FROM_DATABASE=Piaggio Fast Forward + +bluetooth:v083C* + ID_VENDOR_FROM_DATABASE=BeerTech LTD + +bluetooth:v083D* + ID_VENDOR_FROM_DATABASE=Tokenize, Inc. + +bluetooth:v083E* + ID_VENDOR_FROM_DATABASE=Zorachka LTD + +bluetooth:v083F* + ID_VENDOR_FROM_DATABASE=D-Link Corp. + +bluetooth:v0840* + ID_VENDOR_FROM_DATABASE=Down Range Systems LLC + +bluetooth:v0841* + ID_VENDOR_FROM_DATABASE=General Luminaire (Shanghai) Co., Ltd. + +bluetooth:v0842* + ID_VENDOR_FROM_DATABASE=Tangshan HongJia electronic technology co., LTD. + +bluetooth:v0843* + ID_VENDOR_FROM_DATABASE=FRAGRANCE DELIVERY TECHNOLOGIES LTD + +bluetooth:v0844* + ID_VENDOR_FROM_DATABASE=Pepperl + Fuchs GmbH + +bluetooth:v0845* + ID_VENDOR_FROM_DATABASE=Dometic Corporation + +bluetooth:v0846* + ID_VENDOR_FROM_DATABASE=USound GmbH + +bluetooth:v0847* + ID_VENDOR_FROM_DATABASE=DNANUDGE LIMITED + +bluetooth:v0848* + ID_VENDOR_FROM_DATABASE=JUJU JOINTS CANADA CORP. + +bluetooth:v0849* + ID_VENDOR_FROM_DATABASE=Dopple Technologies B.V. + +bluetooth:v084A* + ID_VENDOR_FROM_DATABASE=ARCOM + +bluetooth:v084B* + ID_VENDOR_FROM_DATABASE=Biotechware SRL + +bluetooth:v084C* + ID_VENDOR_FROM_DATABASE=ORSO Inc. + +bluetooth:v084D* + ID_VENDOR_FROM_DATABASE=SafePort + +bluetooth:v084E* + ID_VENDOR_FROM_DATABASE=Carol Cole Company + +bluetooth:v084F* + ID_VENDOR_FROM_DATABASE=Embedded Fitness B.V. + +bluetooth:v0850* + ID_VENDOR_FROM_DATABASE=Yealink (Xiamen) Network Technology Co.,LTD + +bluetooth:v0851* + ID_VENDOR_FROM_DATABASE=Subeca, Inc. + +bluetooth:v0852* + ID_VENDOR_FROM_DATABASE=Cognosos, Inc. + +bluetooth:v0853* + ID_VENDOR_FROM_DATABASE=Pektron Group Limited + +bluetooth:v0854* + ID_VENDOR_FROM_DATABASE=Tap Sound System + +bluetooth:v0855* + ID_VENDOR_FROM_DATABASE=Helios Hockey, Inc. + +bluetooth:v0856* + ID_VENDOR_FROM_DATABASE=Canopy Growth Corporation + +bluetooth:v0857* + ID_VENDOR_FROM_DATABASE=Parsyl Inc + +bluetooth:v0858* + ID_VENDOR_FROM_DATABASE=SOUNDBOKS + +bluetooth:v0859* + ID_VENDOR_FROM_DATABASE=BlueUp + +bluetooth:v085A* + ID_VENDOR_FROM_DATABASE=DAKATECH + +bluetooth:v085B* + ID_VENDOR_FROM_DATABASE=RICOH ELECTRONIC DEVICES CO., LTD. + +bluetooth:v085C* + ID_VENDOR_FROM_DATABASE=ACOS CO.,LTD. + +bluetooth:v085D* + ID_VENDOR_FROM_DATABASE=Guilin Zhishen Information Technology Co.,Ltd. + +bluetooth:v085E* + ID_VENDOR_FROM_DATABASE=Krog Systems LLC + +bluetooth:v085F* + ID_VENDOR_FROM_DATABASE=COMPEGPS TEAM,SOCIEDAD LIMITADA + +bluetooth:v0860* + ID_VENDOR_FROM_DATABASE=Alflex Products B.V. + +bluetooth:v0861* + ID_VENDOR_FROM_DATABASE=SmartSensor Labs Ltd + +bluetooth:v0862* + ID_VENDOR_FROM_DATABASE=SmartDrive Inc. + +bluetooth:v0863* + ID_VENDOR_FROM_DATABASE=Yo-tronics Technology Co., Ltd. + +bluetooth:v0864* + ID_VENDOR_FROM_DATABASE=Rafaelmicro + +bluetooth:v0865* + ID_VENDOR_FROM_DATABASE=Emergency Lighting Products Limited + +bluetooth:v0866* + ID_VENDOR_FROM_DATABASE=LAONZ Co.,Ltd + +bluetooth:v0867* + ID_VENDOR_FROM_DATABASE=Western Digital Techologies, Inc. + +bluetooth:v0868* + ID_VENDOR_FROM_DATABASE=WIOsense GmbH & Co. KG + +bluetooth:v0869* + ID_VENDOR_FROM_DATABASE=EVVA Sicherheitstechnologie GmbH + +bluetooth:v086A* + ID_VENDOR_FROM_DATABASE=Odic Incorporated + +bluetooth:v086B* + ID_VENDOR_FROM_DATABASE=Pacific Track, LLC + +bluetooth:v086C* + ID_VENDOR_FROM_DATABASE=Revvo Technologies, Inc. + +bluetooth:v086D* + ID_VENDOR_FROM_DATABASE=Biometrika d.o.o. + +bluetooth:v086E* + ID_VENDOR_FROM_DATABASE=Vorwerk Elektrowerke GmbH & Co. KG + +bluetooth:v086F* + ID_VENDOR_FROM_DATABASE=Trackunit A/S + +bluetooth:v0870* + ID_VENDOR_FROM_DATABASE=Wyze Labs, Inc + +bluetooth:v0871* + ID_VENDOR_FROM_DATABASE=Dension Elektronikai Kft. (formerly: Dension Audio Systems Ltd.) + +bluetooth:v0872* + ID_VENDOR_FROM_DATABASE=11 Health & Technologies Limited + +bluetooth:v0873* + ID_VENDOR_FROM_DATABASE=Innophase Incorporated + +bluetooth:v0874* + ID_VENDOR_FROM_DATABASE=Treegreen Limited + +bluetooth:v0875* + ID_VENDOR_FROM_DATABASE=Berner International LLC + +bluetooth:v0876* + ID_VENDOR_FROM_DATABASE=SmartResQ ApS + +bluetooth:v0877* + ID_VENDOR_FROM_DATABASE=Tome, Inc. + +bluetooth:v0878* + ID_VENDOR_FROM_DATABASE=The Chamberlain Group, Inc. + +bluetooth:v0879* + ID_VENDOR_FROM_DATABASE=MIZUNO Corporation + +bluetooth:v087A* + ID_VENDOR_FROM_DATABASE=ZRF, LLC + +bluetooth:v087B* + ID_VENDOR_FROM_DATABASE=BYSTAMP + +bluetooth:v087C* + ID_VENDOR_FROM_DATABASE=Crosscan GmbH + +bluetooth:v087D* + ID_VENDOR_FROM_DATABASE=Konftel AB + +bluetooth:v087E* + ID_VENDOR_FROM_DATABASE=1bar.net Limited + +bluetooth:v087F* + ID_VENDOR_FROM_DATABASE=Phillips Connect Technologies LLC + +bluetooth:v0880* + ID_VENDOR_FROM_DATABASE=imagiLabs AB + +bluetooth:v0881* + ID_VENDOR_FROM_DATABASE=Optalert + +bluetooth:v0882* + ID_VENDOR_FROM_DATABASE=PSYONIC, Inc. + +bluetooth:v0883* + ID_VENDOR_FROM_DATABASE=Wintersteiger AG + +bluetooth:v0884* + ID_VENDOR_FROM_DATABASE=Controlid Industria, Comercio de Hardware e Servicos de Tecnologia Ltda + +bluetooth:v0885* + ID_VENDOR_FROM_DATABASE=LEVOLOR, INC. + +bluetooth:v0886* + ID_VENDOR_FROM_DATABASE=Xsens Technologies B.V. + +bluetooth:v0887* + ID_VENDOR_FROM_DATABASE=Hydro-Gear Limited Partnership + +bluetooth:v0888* + ID_VENDOR_FROM_DATABASE=EnPointe Fencing Pty Ltd + +bluetooth:v0889* + ID_VENDOR_FROM_DATABASE=XANTHIO + +bluetooth:v088A* + ID_VENDOR_FROM_DATABASE=sclak s.r.l. + +bluetooth:v088B* + ID_VENDOR_FROM_DATABASE=Tricorder Arraay Technologies LLC + +bluetooth:v088C* + ID_VENDOR_FROM_DATABASE=GB Solution co.,Ltd + +bluetooth:v088D* + ID_VENDOR_FROM_DATABASE=Soliton Systems K.K. + +bluetooth:v088E* + ID_VENDOR_FROM_DATABASE=GIGA-TMS INC + +bluetooth:v088F* + ID_VENDOR_FROM_DATABASE=Tait International Limited + +bluetooth:v0890* + ID_VENDOR_FROM_DATABASE=NICHIEI INTEC CO., LTD. + +bluetooth:v0891* + ID_VENDOR_FROM_DATABASE=SmartWireless GmbH & Co. KG + +bluetooth:v0892* + ID_VENDOR_FROM_DATABASE=Ingenieurbuero Birnfeld UG (haftungsbeschraenkt) + +bluetooth:v0893* + ID_VENDOR_FROM_DATABASE=Maytronics Ltd + +bluetooth:v0894* + ID_VENDOR_FROM_DATABASE=EPIFIT + +bluetooth:v0895* + ID_VENDOR_FROM_DATABASE=Gimer medical + +bluetooth:v0896* + ID_VENDOR_FROM_DATABASE=Nokian Renkaat Oyj + +bluetooth:v0897* + ID_VENDOR_FROM_DATABASE=Current Lighting Solutions LLC + +bluetooth:v0898* + ID_VENDOR_FROM_DATABASE=Sensibo, Inc. + +bluetooth:v0899* + ID_VENDOR_FROM_DATABASE=SFS unimarket AG + +bluetooth:v089A* + ID_VENDOR_FROM_DATABASE=Private limited company "Teltonika" + +bluetooth:v089B* + ID_VENDOR_FROM_DATABASE=Saucon Technologies + +bluetooth:v089C* + ID_VENDOR_FROM_DATABASE=Embedded Devices Co. Company + +bluetooth:v089D* + ID_VENDOR_FROM_DATABASE=J-J.A.D.E. Enterprise LLC + +bluetooth:v089E* + ID_VENDOR_FROM_DATABASE=i-SENS, inc. + +bluetooth:v089F* + ID_VENDOR_FROM_DATABASE=Witschi Electronic Ltd + +bluetooth:v08A0* + ID_VENDOR_FROM_DATABASE=Aclara Technologies LLC + +bluetooth:v08A1* + ID_VENDOR_FROM_DATABASE=EXEO TECH CORPORATION + +bluetooth:v08A2* + ID_VENDOR_FROM_DATABASE=Epic Systems Co., Ltd. + +bluetooth:v08A3* + ID_VENDOR_FROM_DATABASE=Hoffmann SE + +bluetooth:v08A4* + ID_VENDOR_FROM_DATABASE=Realme Chongqing Mobile Telecommunications Corp., Ltd. + +bluetooth:v08A5* + ID_VENDOR_FROM_DATABASE=UMEHEAL Ltd + +bluetooth:v08A6* + ID_VENDOR_FROM_DATABASE=Intelligenceworks Inc. + +bluetooth:v08A7* + ID_VENDOR_FROM_DATABASE=TGR 1.618 Limited + +bluetooth:v08A8* + ID_VENDOR_FROM_DATABASE=Shanghai Kfcube Inc + +bluetooth:v08A9* + ID_VENDOR_FROM_DATABASE=Fraunhofer IIS + +bluetooth:v08AA* + ID_VENDOR_FROM_DATABASE=SZ DJI TECHNOLOGY CO.,LTD + +bluetooth:v08AB* + ID_VENDOR_FROM_DATABASE=Coburn Technology, LLC + +bluetooth:v08AC* + ID_VENDOR_FROM_DATABASE=Topre Corporation + +bluetooth:v08AD* + ID_VENDOR_FROM_DATABASE=Kayamatics Limited + +bluetooth:v08AE* + ID_VENDOR_FROM_DATABASE=Moticon ReGo AG diff --git a/man/coredumpctl.xml b/man/coredumpctl.xml index 4e99bc0d6..ab5dffdfb 100644 --- a/man/coredumpctl.xml +++ b/man/coredumpctl.xml @@ -217,6 +217,17 @@ will be used. + + + + Takes a file glob as an argument. If + specified, coredumpctl will operate on the specified journal + files matching GLOB instead of the + default runtime and system journal paths. May be specified + multiple times, in which case files will be suitably + interleaved. + + DIR DIR diff --git a/man/homectl.xml b/man/homectl.xml index ae502c8eb..2d99af93b 100644 --- a/man/homectl.xml +++ b/man/homectl.xml @@ -677,7 +677,10 @@ Create a new home directory/user account of the specified name. Use the various user record property options (as documented above) to control various aspects of the home directory - and its user accounts. + and its user accounts. + + The specified user name should follow the strict syntax described on User/Group Name Syntax. diff --git a/man/journalctl.xml b/man/journalctl.xml index 2a685d1ee..1e5f95e19 100644 --- a/man/journalctl.xml +++ b/man/journalctl.xml @@ -398,8 +398,8 @@ - A comma separated list of the fields which should be included in the output. This only has an - effect for the output modes which would normally show all fields (, + A comma separated list of the fields which should be included in the output. This has an + effect only for the output modes which would normally show all fields (, , , , and ). The __CURSOR, __REALTIME_TIMESTAMP, __MONOTONIC_TIMESTAMP, and _BOOT_ID fields are always @@ -416,8 +416,13 @@ - Don't show the hostname field of log messages originating from the local host. This switch only - has an effect on the family of output modes (see above). + Don't show the hostname field of log messages originating from the local host. This + switch has an effect only on the family of output modes (see above). + + + Note: this option does not remove occurrences of the hostname from log entries themselves, so + it does not prevent the hostname from being visible in the logs. + diff --git a/man/systemd-run.xml b/man/systemd-run.xml index 3a1d18dae..6fc2c8d0e 100644 --- a/man/systemd-run.xml +++ b/man/systemd-run.xml @@ -146,8 +146,10 @@ - Make the new .service or .scope unit part of the - specified slice, instead of system.slice. + Make the new .service or .scope unit part + of the specified slice, instead of system.slice (when running in + mode) or the root slice (when running in + mode). diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml index 79a2c744c..fd1755e42 100644 --- a/man/systemd.exec.xml +++ b/man/systemd.exec.xml @@ -217,12 +217,15 @@ is set, the default group of the user is used. This setting does not affect commands whose command line is prefixed with +. - Note that restrictions on the user/group name syntax are enforced: the specified name must consist only - of the characters a-z, A-Z, 0-9, _ and -, except for the first character - which must be one of a-z, A-Z or _ (i.e. numbers and - are not permitted - as first character). The user/group name must have at least one character, and at most 31. These restrictions - are enforced in order to avoid ambiguities and to ensure user/group names and unit files remain portable among - Linux systems. + Note that this enforces only weak restrictions on the user/group name syntax, but will generate + warnings in many cases where user/group names do not adhere to the following rules: the specified + name should consist only of the characters a-z, A-Z, 0-9, _ and + -, except for the first character which must be one of a-z, A-Z and + _ (i.e. digits and - are not permitted as first character). The + user/group name must have at least one character, and at most 31. These restrictions are made in + order to avoid ambiguities and to ensure user/group names and unit files remain portable among Linux + systems. For further details on the names accepted and the names warned about see User/Group Name Syntax. When used in conjunction with DynamicUser= the user/group name specified is dynamically allocated at the time the service is started, and released at the time the service is diff --git a/man/systemd.service.xml b/man/systemd.service.xml index 17e446e20..02eb70678 100644 --- a/man/systemd.service.xml +++ b/man/systemd.service.xml @@ -423,6 +423,9 @@ ExecStart=, or ExecStartPost= fail (and are not prefixed with -, see above) or time out before the service is fully up, execution continues with commands specified in ExecStopPost=, the commands in ExecStop= are skipped. + + Note that the execution of ExecStartPost= is taken into account for the purpose of + Before=/After= ordering constraints. @@ -534,7 +537,10 @@ service, as well as the main process' exit code and status, set in the $SERVICE_RESULT, $EXIT_CODE and $EXIT_STATUS environment variables, see systemd.exec5 for - details. + details. + + Note that the execution of ExecStopPost= is taken into account for the purpose of + Before=/After= ordering constraints. diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml index 64240208c..0d223d74d 100644 --- a/man/systemd.unit.xml +++ b/man/systemd.unit.xml @@ -750,7 +750,7 @@ type when precisely a unit has finished starting up. Most importantly, for service units start-up is considered completed for the purpose of Before=/After= when all its configured start-up commands have been invoked and they either failed or reported start-up - success. + success. Note that this does includes ExecStartPost (or ExecStopPost for the shutdown case). Note that those settings are independent of and orthogonal to the requirement dependencies as configured by Requires=, Wants=, Requisite=, diff --git a/man/sysusers.d.xml b/man/sysusers.d.xml index c632e8713..f0e0f2bed 100644 --- a/man/sysusers.d.xml +++ b/man/sysusers.d.xml @@ -154,6 +154,9 @@ r - 500-900 A-Z or _ (i.e. numbers and - are not permitted as first character). The user/group name must have at least one character, and at most 31. + For further details about the syntax of user/group names, see User/Group Name Syntax. + It is strongly recommended to pick user and group names that are unlikely to clash with normal users created by the administrator. A good scheme to guarantee this is by prefixing all system and group names with the underscore, and avoiding too generic names. diff --git a/src/analyze/analyze-verify.c b/src/analyze/analyze-verify.c index 4cfbdfa5a..8275360ad 100644 --- a/src/analyze/analyze-verify.c +++ b/src/analyze/analyze-verify.c @@ -124,10 +124,13 @@ static int verify_socket(Unit *u) { return 0; } -static int verify_executable(Unit *u, ExecCommand *exec) { +int verify_executable(Unit *u, const ExecCommand *exec) { if (!exec) return 0; + if (exec->flags & EXEC_COMMAND_IGNORE_FAILURE) + return 0; + if (access(exec->path, X_OK) < 0) return log_unit_error_errno(u, errno, "Command %s is not executable: %m", exec->path); diff --git a/src/analyze/analyze-verify.h b/src/analyze/analyze-verify.h index 3561d4302..3da2cf709 100644 --- a/src/analyze/analyze-verify.h +++ b/src/analyze/analyze-verify.h @@ -3,6 +3,8 @@ #include +#include "execute.h" #include "path-lookup.h" +int verify_executable(Unit *u, const ExecCommand *exec); int verify_units(char **filenames, UnitFileScope scope, bool check_man, bool run_generators); diff --git a/src/analyze/test-verify.c b/src/analyze/test-verify.c new file mode 100644 index 000000000..dcbb6394c --- /dev/null +++ b/src/analyze/test-verify.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ +#include "analyze-verify.h" +#include "tests.h" + +static void test_verify_nonexistent(void) { + /* Negative cases */ + assert_se(verify_executable(NULL, &(ExecCommand) {.flags = EXEC_COMMAND_IGNORE_FAILURE, .path = (char*) "/non/existent"}) == 0); + assert_se(verify_executable(NULL, &(ExecCommand) {.path = (char*) "/non/existent"}) < 0); + + /* Ordinary cases */ + assert_se(verify_executable(NULL, &(ExecCommand) {.path = (char*) "/bin/echo"}) == 0); + assert_se(verify_executable(NULL, &(ExecCommand) {.flags = EXEC_COMMAND_IGNORE_FAILURE, .path = (char*) "/bin/echo"}) == 0); +} + +int main(int argc, char *argv[]) { + test_setup_logging(LOG_DEBUG); + + test_verify_nonexistent(); +} diff --git a/src/basic/capability-util.c b/src/basic/capability-util.c index caffda62a..9dbebfa16 100644 --- a/src/basic/capability-util.c +++ b/src/basic/capability-util.c @@ -107,11 +107,13 @@ int capability_ambient_set_apply(uint64_t set, bool also_inherit) { unsigned long i; int r; + /* Add the capabilities to the ambient set (an possibly also the inheritable set) */ + /* Check that we can use PR_CAP_AMBIENT or quit early. */ if (!ambient_capabilities_supported()) - return 0; - - /* Add the capabilities to the ambient set. */ + return (set & all_capabilities()) == 0 ? + 0 : -EOPNOTSUPP; /* if actually no ambient caps are to be set, be silent, + * otherwise fail recognizably */ if (also_inherit) { caps = cap_get_proc(); diff --git a/src/basic/fileio.c b/src/basic/fileio.c index fe0c4f470..ec9d76688 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -81,7 +81,7 @@ int write_string_stream_ts( struct timespec *ts) { bool needs_nl; - int r; + int r, fd; assert(f); assert(line); @@ -89,6 +89,14 @@ int write_string_stream_ts( if (ferror(f)) return -EIO; + if (ts) { + /* If we shall set the timestamp we need the fd. But fmemopen() streams generally don't have + * an fd. Let's fail early in that case. */ + fd = fileno(f); + if (fd < 0) + return -EBADF; + } + needs_nl = !(flags & WRITE_STRING_FILE_AVOID_NEWLINE) && !endswith(line, "\n"); if (needs_nl && (flags & WRITE_STRING_FILE_DISABLE_BUFFER)) { @@ -116,7 +124,7 @@ int write_string_stream_ts( if (ts) { struct timespec twice[2] = {*ts, *ts}; - if (futimens(fileno(f), twice) < 0) + if (futimens(fd, twice) < 0) return -errno; } @@ -848,7 +856,7 @@ int fflush_and_check(FILE *f) { } int fflush_sync_and_check(FILE *f) { - int r; + int r, fd; assert(f); @@ -856,10 +864,16 @@ int fflush_sync_and_check(FILE *f) { if (r < 0) return r; - if (fsync(fileno(f)) < 0) + /* Not all file streams have an fd associated (think: fmemopen()), let's handle this gracefully and + * assume that in that case we need no explicit syncing */ + fd = fileno(f); + if (fd < 0) + return 0; + + if (fsync(fd) < 0) return -errno; - r = fsync_directory_of_file(fileno(f)); + r = fsync_directory_of_file(fd); if (r < 0) return r; @@ -957,7 +971,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, funlockfile); int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret) { size_t n = 0, allocated = 0, count = 0; _cleanup_free_ char *buffer = NULL; - int r, tty = -1; + int r; assert(f); @@ -1032,13 +1046,23 @@ int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret) { count++; if (eol != EOL_NONE) { - /* If we are on a tty, we can't wait for more input. But we expect only - * \n as the single EOL marker, so there is no need to wait. We check - * this condition last to avoid isatty() check if not necessary. */ + /* If we are on a tty, we can't shouldn't wait for more input, because that + * generally means waiting for the user, interactively. In the case of a TTY + * we expect only \n as the single EOL marker, so we are in the lucky + * position that there is no need to wait. We check this condition last, to + * avoid isatty() check if not necessary. */ - if (tty < 0) - tty = isatty(fileno(f)); - if (tty > 0) + if ((flags & (READ_LINE_IS_A_TTY|READ_LINE_NOT_A_TTY)) == 0) { + int fd; + + fd = fileno(f); + if (fd < 0) /* Maybe an fmemopen() stream? Handle this gracefully, + * and don't call isatty() on an invalid fd */ + flags |= READ_LINE_NOT_A_TTY; + else + flags |= isatty(fd) ? READ_LINE_IS_A_TTY : READ_LINE_NOT_A_TTY; + } + if (FLAGS_SET(flags, READ_LINE_IS_A_TTY)) break; } diff --git a/src/basic/fileio.h b/src/basic/fileio.h index e6fea2afd..d140bfd99 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -85,7 +85,9 @@ int read_timestamp_file(const char *fn, usec_t *ret); int fputs_with_space(FILE *f, const char *s, const char *separator, bool *space); typedef enum ReadLineFlags { - READ_LINE_ONLY_NUL = 1 << 0, + READ_LINE_ONLY_NUL = 1 << 0, + READ_LINE_IS_A_TTY = 1 << 1, + READ_LINE_NOT_A_TTY = 1 << 2, } ReadLineFlags; int read_line_full(FILE *f, size_t limit, ReadLineFlags flags, char **ret); diff --git a/src/basic/string-util.c b/src/basic/string-util.c index 8f812d7cb..93b7a2203 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -113,7 +113,7 @@ static size_t strcspn_escaped(const char *s, const char *reject) { bool escaped = false; int n; - for (n=0; s[n]; n++) { + for (n = 0; s[n] != '\0'; n++) { if (escaped) escaped = false; else if (s[n] == '\\') @@ -122,8 +122,7 @@ static size_t strcspn_escaped(const char *s, const char *reject) { break; } - /* if s ends in \, return index of previous char */ - return n - escaped; + return n; } /* Split a string into words. */ diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 511734cbb..6cacde90b 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -81,31 +81,34 @@ int chvt(int vt) { int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) { _cleanup_free_ char *line = NULL; struct termios old_termios; - int r; + int r, fd; assert(f); assert(ret); - /* If this is a terminal, then switch canonical mode off, so that we can read a single character */ - if (tcgetattr(fileno(f), &old_termios) >= 0) { + /* If this is a terminal, then switch canonical mode off, so that we can read a single + * character. (Note that fmemopen() streams do not have an fd associated with them, let's handle that + * nicely.) */ + fd = fileno(f); + if (fd >= 0 && tcgetattr(fd, &old_termios) >= 0) { struct termios new_termios = old_termios; new_termios.c_lflag &= ~ICANON; new_termios.c_cc[VMIN] = 1; new_termios.c_cc[VTIME] = 0; - if (tcsetattr(fileno(f), TCSADRAIN, &new_termios) >= 0) { + if (tcsetattr(fd, TCSADRAIN, &new_termios) >= 0) { char c; if (t != USEC_INFINITY) { - if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0) { - (void) tcsetattr(fileno(f), TCSADRAIN, &old_termios); + if (fd_wait_for_event(fd, POLLIN, t) <= 0) { + (void) tcsetattr(fd, TCSADRAIN, &old_termios); return -ETIMEDOUT; } } r = safe_fgetc(f, &c); - (void) tcsetattr(fileno(f), TCSADRAIN, &old_termios); + (void) tcsetattr(fd, TCSADRAIN, &old_termios); if (r < 0) return r; if (r == 0) @@ -119,8 +122,13 @@ int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) { } } - if (t != USEC_INFINITY) { - if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0) + if (t != USEC_INFINITY && fd > 0) { + /* Let's wait the specified amount of time for input. When we have no fd we skip this, under + * the assumption that this is an fmemopen() stream or so where waiting doesn't make sense + * anyway, as the data is either already in the stream or cannot possible be placed there + * while we access the stream */ + + if (fd_wait_for_event(fd, POLLIN, t) <= 0) return -ETIMEDOUT; } @@ -778,6 +786,9 @@ const char *default_term_for_tty(const char *tty) { int fd_columns(int fd) { struct winsize ws = {}; + if (fd < 0) + return -EBADF; + if (ioctl(fd, TIOCGWINSZ, &ws) < 0) return -errno; @@ -812,6 +823,9 @@ unsigned columns(void) { int fd_lines(int fd) { struct winsize ws = {}; + if (fd < 0) + return -EBADF; + if (ioctl(fd, TIOCGWINSZ, &ws) < 0) return -errno; diff --git a/src/basic/user-util.c b/src/basic/user-util.c index 1510fc96e..2e3580017 100644 --- a/src/basic/user-util.c +++ b/src/basic/user-util.c @@ -10,6 +10,8 @@ #include #include +#include "sd-messages.h" + #include "alloc-util.h" #include "errno-util.h" #include "fd-util.h" @@ -18,6 +20,7 @@ #include "macro.h" #include "parse-util.h" #include "path-util.h" +#include "path-util.h" #include "random-util.h" #include "string-util.h" #include "strv.h" @@ -698,92 +701,125 @@ int take_etc_passwd_lock(const char *root) { return fd; } -bool valid_user_group_name_full(const char *u, bool strict) { +bool valid_user_group_name(const char *u, ValidUserFlags flags) { const char *i; - long sz; - bool warned = false; - /* Checks if the specified name is a valid user/group name. Also see POSIX IEEE Std 1003.1-2008, 2016 Edition, - * 3.437. We are a bit stricter here however. Specifically we deviate from POSIX rules: + /* Checks if the specified name is a valid user/group name. There are two flavours of this call: + * strict mode is the default which is POSIX plus some extra rules; and relaxed mode where we accept + * pretty much everything except the really worst offending names. * - * - We require that names fit into the appropriate utmp field - * - We don't allow empty user names - * - No dots in the first character - * - * If strict==true, additionally: - * - We don't allow any dots (this conflicts with chown syntax which permits dots as user/group name separator) - * - We don't allow a digit as the first character - * - * Note that other systems are even more restrictive, and don't permit underscores or uppercase characters. - */ + * Whenever we synthesize users ourselves we should use the strict mode. But when we process users + * created by other stuff, let's be more liberal. */ - if (isempty(u)) + if (isempty(u)) /* An empty user name is never valid */ return false; - if (!(u[0] >= 'a' && u[0] <= 'z') && - !(u[0] >= 'A' && u[0] <= 'Z') && - !(u[0] >= '0' && u[0] <= '9' && !strict) && - u[0] != '_') - return false; + if (parse_uid(u, NULL) >= 0) /* Something that parses as numeric UID string is valid exactly when the + * flag for it is set */ + return FLAGS_SET(flags, VALID_USER_ALLOW_NUMERIC); - bool only_digits_seen = u[0] >= '0' && u[0] <= '9'; + if (FLAGS_SET(flags, VALID_USER_RELAX)) { - if (only_digits_seen) { - log_warning("User or group name \"%s\" starts with a digit, accepting for compatibility.", u); - warned = true; + /* In relaxed mode we just check very superficially. Apparently SSSD and other stuff is + * extremely liberal (way too liberal if you ask me, even inserting "@" in user names, which + * is bound to cause problems for example when used with an MTA), hence only filter the most + * obvious cases, or where things would result in an invalid entry if such a user name would + * show up in /etc/passwd (or equivalent getent output). + * + * Note that we stepped far out of POSIX territory here. It's not our fault though, but + * SSSD's, Samba's and everybody else who ignored POSIX on this. (I mean, I am happy to step + * outside of POSIX' bounds any day, but I must say in this case I probably wouldn't + * have...) */ + + if (startswith(u, " ") || endswith(u, " ")) /* At least expect whitespace padding is removed + * at front and back (accept in the middle, since + * that's apparently a thing on Windows). Note + * that this also blocks usernames consisting of + * whitespace only. */ + return false; + + if (!utf8_is_valid(u)) /* We want to synthesize JSON from this, hence insist on UTF-8 */ + return false; + + if (string_has_cc(u, NULL)) /* CC characters are just dangerous (and \n in particular is the + * record separator in /etc/passwd), so we can't allow that. */ + return false; + + if (strpbrk(u, ":/")) /* Colons are the field separator in /etc/passwd, we can't allow + * that. Slashes are special to file systems paths and user names + * typically show up in the file system as home directories, hence + * don't allow slashes. */ + return false; + + if (in_charset(u, "0123456789")) /* Don't allow fully numeric strings, they might be confused + * with with UIDs (note that this test is more broad than + * the parse_uid() test above, as it will cover more than + * the 32bit range, and it will detect 65535 (which is in + * invalid UID, even though in the unsigned 32 bit range) */ + return false; + + if (u[0] == '-' && in_charset(u + 1, "0123456789")) /* Don't allow negative fully numeric + * strings either. After all some people + * write 65535 as -1 (even though that's + * not even true on 32bit uid_t + * anyway) */ + return false; + + if (dot_or_dot_dot(u)) /* User names typically become home directory names, and these two are + * special in that context, don't allow that. */ + return false; + + /* Compare with strict result and warn if result doesn't match */ + if (FLAGS_SET(flags, VALID_USER_WARN) && !valid_user_group_name(u, 0)) + log_struct(LOG_NOTICE, + "MESSAGE=Accepting user/group name '%s', which does not match strict user/group name rules.", u, + "USER_GROUP_NAME=%s", u, + "MESSAGE_ID=" SD_MESSAGE_UNSAFE_USER_NAME_STR); + + /* Note that we make no restrictions on the length in relaxed mode! */ + } else { + long sz; + size_t l; + + /* Also see POSIX IEEE Std 1003.1-2008, 2016 Edition, 3.437. We are a bit stricter here + * however. Specifically we deviate from POSIX rules: + * + * - We don't allow empty user names (see above) + * - We require that names fit into the appropriate utmp field + * - We don't allow any dots (this conflicts with chown syntax which permits dots as user/group name separator) + * - We don't allow dashes or digit as the first character + * + * Note that other systems are even more restrictive, and don't permit underscores or uppercase characters. + */ + + if (!(u[0] >= 'a' && u[0] <= 'z') && + !(u[0] >= 'A' && u[0] <= 'Z') && + u[0] != '_') + return false; + + for (i = u+1; *i; i++) + if (!(*i >= 'a' && *i <= 'z') && + !(*i >= 'A' && *i <= 'Z') && + !(*i >= '0' && *i <= '9') && + !IN_SET(*i, '_', '-')) + return false; + + l = i - u; + + sz = sysconf(_SC_LOGIN_NAME_MAX); + assert_se(sz > 0); + + if (l > (size_t) sz) + return false; + if (l > FILENAME_MAX) + return false; + if (l > UT_NAMESIZE - 1) + return false; } - for (i = u+1; *i; i++) { - if (((*i >= 'a' && *i <= 'z') || - (*i >= 'A' && *i <= 'Z') || - (*i >= '0' && *i <= '9') || - IN_SET(*i, '_', '-'))) { - if (!(*i >= '0' && *i <= '9')) - only_digits_seen = false; - continue; - } - - if (*i == '.' && !strict) { - if (!warned) { - log_warning("Bad user or group name \"%s\", accepting for compatibility.", u); - warned = true; - } - - continue; - } - - return false; - } - - if (only_digits_seen) - return false; - - sz = sysconf(_SC_LOGIN_NAME_MAX); - assert_se(sz > 0); - - if ((size_t) (i-u) > (size_t) sz) - return false; - - if ((size_t) (i-u) > UT_NAMESIZE - 1) - return false; - return true; } -bool valid_user_group_name_or_id_full(const char *u, bool strict) { - - /* Similar as above, but is also fine with numeric UID/GID specifications, as long as they are in the - * right range, and not the invalid user ids. */ - - if (isempty(u)) - return false; - - if (parse_uid(u, NULL) >= 0) - return true; - - return valid_user_group_name_full(u, strict); -} - bool valid_gecos(const char *d) { if (!d) diff --git a/src/basic/user-util.h b/src/basic/user-util.h index 6796ac42c..1f267d21a 100644 --- a/src/basic/user-util.h +++ b/src/basic/user-util.h @@ -97,20 +97,13 @@ static inline bool userns_supported(void) { return access("/proc/self/uid_map", F_OK) >= 0; } -bool valid_user_group_name_full(const char *u, bool strict); -bool valid_user_group_name_or_id_full(const char *u, bool strict); -static inline bool valid_user_group_name(const char *u) { - return valid_user_group_name_full(u, true); -} -static inline bool valid_user_group_name_or_id(const char *u) { - return valid_user_group_name_or_id_full(u, true); -} -static inline bool valid_user_group_name_compat(const char *u) { - return valid_user_group_name_full(u, false); -} -static inline bool valid_user_group_name_or_id_compat(const char *u) { - return valid_user_group_name_or_id_full(u, false); -} +typedef enum ValidUserFlags { + VALID_USER_RELAX = 1 << 0, + VALID_USER_WARN = 1 << 1, + VALID_USER_ALLOW_NUMERIC = 1 << 2, +} ValidUserFlags; + +bool valid_user_group_name(const char *u, ValidUserFlags flags); bool valid_gecos(const char *d); bool valid_home(const char *p); diff --git a/src/basic/virt.c b/src/basic/virt.c index 07831634d..f56769626 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -462,13 +462,14 @@ int detect_container(void) { goto finish; } - /* "Official" way of detecting WSL https://github.com/Microsoft/WSL/issues/423#issuecomment-221627364 */ + /* "Official" way of detecting WSL https://github.com/Microsoft/WSL/issues/423#issuecomment-221627364, + * ... and a working one, since the official one doesn't actually work ;( + */ r = read_one_line_file("/proc/sys/kernel/osrelease", &o); - if (r >= 0) { - if (strstr(o, "Microsoft") || strstr(o, "WSL")) { - r = VIRTUALIZATION_WSL; - goto finish; - } + if (r >= 0 && + (strstr(o, "Microsoft") || strstr(o, "microsoft") || strstr(o, "WSL"))) { + r = VIRTUALIZATION_WSL; + goto finish; } if (getpid_cached() == 1) { diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c index e8be76e31..93857436b 100644 --- a/src/core/dbus-execute.c +++ b/src/core/dbus-execute.c @@ -795,6 +795,7 @@ const sd_bus_vtable bus_exec_vtable[] = { SD_BUS_PROPERTY("MountFlags", "t", bus_property_get_ulong, offsetof(ExecContext, mount_flags), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("PrivateTmp", "b", bus_property_get_bool, offsetof(ExecContext, private_tmp), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("PrivateDevices", "b", bus_property_get_bool, offsetof(ExecContext, private_devices), SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("ProtectClock", "b", bus_property_get_bool, offsetof(ExecContext, protect_clock), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("ProtectKernelTunables", "b", bus_property_get_bool, offsetof(ExecContext, protect_kernel_tunables), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("ProtectKernelModules", "b", bus_property_get_bool, offsetof(ExecContext, protect_kernel_modules), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("ProtectKernelLogs", "b", bus_property_get_bool, offsetof(ExecContext, protect_kernel_logs), SD_BUS_VTABLE_PROPERTY_CONST), @@ -1203,10 +1204,10 @@ int bus_exec_context_set_transient_property( flags |= UNIT_PRIVATE; if (streq(name, "User")) - return bus_set_transient_user_compat(u, name, &c->user, message, flags, error); + return bus_set_transient_user_relaxed(u, name, &c->user, message, flags, error); if (streq(name, "Group")) - return bus_set_transient_user_compat(u, name, &c->group, message, flags, error); + return bus_set_transient_user_relaxed(u, name, &c->group, message, flags, error); if (streq(name, "TTYPath")) return bus_set_transient_path(u, name, &c->tty_path, message, flags, error); @@ -1391,7 +1392,7 @@ int bus_exec_context_set_transient_property( return r; STRV_FOREACH(p, l) - if (!isempty(*p) && !valid_user_group_name_or_id_compat(*p)) + if (!isempty(*p) && !valid_user_group_name(*p, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX|VALID_USER_WARN)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid supplementary group names"); diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 60f55aef5..ef4bb316c 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -1643,7 +1643,7 @@ static int method_lookup_dynamic_user_by_name(sd_bus_message *message, void *use if (!MANAGER_IS_SYSTEM(m)) return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Dynamic users are only supported in the system instance."); - if (!valid_user_group_name(name)) + if (!valid_user_group_name(name, VALID_USER_RELAX)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name invalid: %s", name); r = dynamic_user_lookup_name(m, name, &uid); diff --git a/src/core/dbus-socket.c b/src/core/dbus-socket.c index c8253c794..ad7b41a95 100644 --- a/src/core/dbus-socket.c +++ b/src/core/dbus-socket.c @@ -278,10 +278,10 @@ static int bus_socket_set_transient_property( return bus_set_transient_fdname(u, name, &s->fdname, message, flags, error); if (streq(name, "SocketUser")) - return bus_set_transient_user_compat(u, name, &s->user, message, flags, error); + return bus_set_transient_user_relaxed(u, name, &s->user, message, flags, error); if (streq(name, "SocketGroup")) - return bus_set_transient_user_compat(u, name, &s->group, message, flags, error); + return bus_set_transient_user_relaxed(u, name, &s->group, message, flags, error); if (streq(name, "BindIPv6Only")) return bus_set_transient_bind_ipv6_only(u, name, &s->bind_ipv6_only, message, flags, error); diff --git a/src/core/dbus-util.c b/src/core/dbus-util.c index 7862beaac..951450e53 100644 --- a/src/core/dbus-util.c +++ b/src/core/dbus-util.c @@ -30,7 +30,12 @@ int bus_property_get_triggered_unit( BUS_DEFINE_SET_TRANSIENT(mode_t, "u", uint32_t, mode_t, "%040o"); BUS_DEFINE_SET_TRANSIENT(unsigned, "u", uint32_t, unsigned, "%" PRIu32); -BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(user_compat, valid_user_group_name_or_id_compat); + +static inline bool valid_user_group_name_or_id_relaxed(const char *u) { + return valid_user_group_name(u, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX); +} + +BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(user_relaxed, valid_user_group_name_or_id_relaxed); BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(path, path_is_absolute); int bus_set_transient_string( diff --git a/src/core/dbus-util.h b/src/core/dbus-util.h index ec8c245ff..654ceb527 100644 --- a/src/core/dbus-util.h +++ b/src/core/dbus-util.h @@ -236,7 +236,7 @@ int bus_property_get_triggered_unit(sd_bus *bus, const char *path, const char *i int bus_set_transient_mode_t(Unit *u, const char *name, mode_t *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error); int bus_set_transient_unsigned(Unit *u, const char *name, unsigned *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error); -int bus_set_transient_user_compat(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error); +int bus_set_transient_user_relaxed(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error); int bus_set_transient_path(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error); int bus_set_transient_string(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error); int bus_set_transient_bool(Unit *u, const char *name, bool *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error); diff --git a/src/core/dynamic-user.c b/src/core/dynamic-user.c index f1819b36b..58b37925b 100644 --- a/src/core/dynamic-user.c +++ b/src/core/dynamic-user.c @@ -116,7 +116,7 @@ static int dynamic_user_acquire(Manager *m, const char *name, DynamicUser** ret) return 0; } - if (!valid_user_group_name_or_id(name)) + if (!valid_user_group_name(name, VALID_USER_ALLOW_NUMERIC)) return -EINVAL; if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, storage_socket) < 0) diff --git a/src/core/execute.c b/src/core/execute.c index 3d50a0857..2a65ee3fb 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -1577,7 +1577,7 @@ static int apply_protect_kernel_logs(const Unit *u, const ExecContext *c) { return seccomp_protect_syslog(); } -static int apply_protect_clock(const Unit *u, const ExecContext *c) { +static int apply_protect_clock(const Unit *u, const ExecContext *c) { assert(u); assert(c); @@ -1646,6 +1646,41 @@ static int apply_lock_personality(const Unit* u, const ExecContext *c) { #endif +static int apply_protect_hostname(const Unit *u, const ExecContext *c, int *ret_exit_status) { + int r; + + assert(u); + assert(c); + + if (!c->protect_hostname) + return 0; + + if (ns_type_supported(NAMESPACE_UTS)) { + if (unshare(CLONE_NEWUTS) < 0) { + if (!ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno)) { + *ret_exit_status = EXIT_NAMESPACE; + return log_unit_error_errno(u, errno, "Failed to set up UTS namespacing: %m"); + } + + log_unit_warning(u, "ProtectHostname=yes is configured, but UTS namespace setup is prohibited (container manager?), ignoring namespace setup."); + } + } else + log_unit_warning(u, "ProtectHostname=yes is configured, but the kernel does not support UTS namespaces, ignoring namespace setup."); + +#if HAVE_SECCOMP + if (skip_seccomp_unavailable(u, "ProtectHostname=")) + return 0; + + r = seccomp_protect_hostname(); + if (r < 0) { + *ret_exit_status = EXIT_SECCOMP; + return log_unit_error_errno(u, r, "Failed to apply hostname restrictions: %m"); + } +#endif + + return 0; +} + static void do_idle_pipe_dance(int idle_pipe[static 4]) { assert(idle_pipe); @@ -3588,25 +3623,10 @@ static int exec_child( } } - if (context->protect_hostname) { - if (ns_type_supported(NAMESPACE_UTS)) { - if (unshare(CLONE_NEWUTS) < 0) { - if (!ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno)) { - *exit_status = EXIT_NAMESPACE; - return log_unit_error_errno(unit, errno, "Failed to set up UTS namespacing: %m"); - } - - log_unit_warning(unit, "ProtectHostname=yes is configured, but UTS namespace setup is prohibited (container manager?), ignoring namespace setup."); - } - } else - log_unit_warning(unit, "ProtectHostname=yes is configured, but the kernel does not support UTS namespaces, ignoring namespace setup."); -#if HAVE_SECCOMP - r = seccomp_protect_hostname(); - if (r < 0) { - *exit_status = EXIT_SECCOMP; - return log_unit_error_errno(unit, r, "Failed to apply hostname restrictions: %m"); - } -#endif + if (needs_sandboxing) { + r = apply_protect_hostname(unit, context, exit_status); + if (r < 0) + return r; } /* Drop groups as early as possible. diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 646364eb8..f3fe73535 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -2068,7 +2068,7 @@ int config_parse_user_group_compat( return -ENOEXEC; } - if (!valid_user_group_name_or_id_compat(k)) { + if (!valid_user_group_name(k, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX|VALID_USER_WARN)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid user/group name or numeric ID: %s", k); return -ENOEXEC; } @@ -2122,7 +2122,7 @@ int config_parse_user_group_strv_compat( return -ENOEXEC; } - if (!valid_user_group_name_or_id_compat(k)) { + if (!valid_user_group_name(k, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX|VALID_USER_WARN)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid user/group name or numeric ID: %s", k); return -ENOEXEC; } diff --git a/src/core/unit.c b/src/core/unit.c index 2816bcef5..97e1b0004 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -4278,7 +4278,7 @@ static int user_from_unit_name(Unit *u, char **ret) { if (r < 0) return r; - if (valid_user_group_name(n)) { + if (valid_user_group_name(n, 0)) { *ret = TAKE_PTR(n); return 0; } diff --git a/src/coredump/coredumpctl.c b/src/coredump/coredumpctl.c index ed1246496..a84826817 100644 --- a/src/coredump/coredumpctl.c +++ b/src/coredump/coredumpctl.c @@ -17,6 +17,7 @@ #include "def.h" #include "fd-util.h" #include "fs-util.h" +#include "glob-util.h" #include "journal-internal.h" #include "journal-util.h" #include "log.h" @@ -44,6 +45,7 @@ static usec_t arg_since = USEC_INFINITY, arg_until = USEC_INFINITY; static const char* arg_field = NULL; static const char *arg_debugger = NULL; static const char *arg_directory = NULL; +static char **arg_file = NULL; static PagerFlags arg_pager_flags = 0; static int arg_no_legend = false; static int arg_one = false; @@ -51,6 +53,8 @@ static const char* arg_output = NULL; static bool arg_reverse = false; static bool arg_quiet = false; +STATIC_DESTRUCTOR_REGISTER(arg_file, strv_freep); + static int add_match(sd_journal *j, const char *match) { _cleanup_free_ char *p = NULL; const char* prefix, *pattern; @@ -111,6 +115,10 @@ static int acquire_journal(sd_journal **ret, char **matches) { r = sd_journal_open_directory(&j, arg_directory, 0); if (r < 0) return log_error_errno(r, "Failed to open journals in directory: %s: %m", arg_directory); + } else if (arg_file) { + r = sd_journal_open_files(&j, (const char**)arg_file, 0); + if (r < 0) + return log_error_errno(r, "Failed to open journal files: %m"); } else { r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY); if (r < 0) @@ -164,6 +172,7 @@ static int help(void) { " -r --reverse Show the newest entries first\n" " -F --field=FIELD List all values a certain field takes\n" " -o --output=FILE Write output to FILE\n" + " --file=PATH Use journal file\n" " -D --directory=DIR Use journal files from directory\n\n" " -q --quiet Do not show info messages and privilege warning\n" "\nSee the %s for details.\n" @@ -182,6 +191,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_NO_PAGER, ARG_NO_LEGEND, ARG_DEBUGGER, + ARG_FILE, }; int c, r; @@ -194,6 +204,7 @@ static int parse_argv(int argc, char *argv[]) { { "debugger", required_argument, NULL, ARG_DEBUGGER }, { "output", required_argument, NULL, 'o' }, { "field", required_argument, NULL, 'F' }, + { "file", required_argument, NULL, ARG_FILE }, { "directory", required_argument, NULL, 'D' }, { "reverse", no_argument, NULL, 'r' }, { "since", required_argument, NULL, 'S' }, @@ -225,6 +236,12 @@ static int parse_argv(int argc, char *argv[]) { arg_debugger = optarg; break; + case ARG_FILE: + r = glob_extend(&arg_file, optarg); + if (r < 0) + return log_error_errno(r, "Failed to add paths: %m"); + break; + case 'o': if (arg_output) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), @@ -1096,6 +1113,7 @@ static int run(int argc, char *argv[]) { ansi_highlight_red(), units_active, units_active == 1 ? "unit is running" : "units are running", ansi_normal()); + return r; } diff --git a/src/home/home-util.c b/src/home/home-util.c index a53b0d339..69ab64548 100644 --- a/src/home/home-util.c +++ b/src/home/home-util.c @@ -17,7 +17,7 @@ bool suitable_user_name(const char *name) { * restrictive, so that we can change the rules server-side without having to update things * client-side too. */ - if (!valid_user_group_name(name)) + if (!valid_user_group_name(name, 0)) return false; /* We generally rely on NSS to tell us which users not to care for, but let's filter out some diff --git a/src/home/homectl.c b/src/home/homectl.c index 1ccc053d3..66d4bb6bd 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -540,7 +540,7 @@ static int inspect_home(int argc, char *argv[], void *userdata) { r = parse_uid(*i, &uid); if (r < 0) { - if (!valid_user_group_name(*i)) { + if (!valid_user_group_name(*i, 0)) { log_error("Invalid user name '%s'.", *i); if (ret == 0) ret = -EINVAL; @@ -1395,7 +1395,7 @@ static int create_home(int argc, char *argv[], void *userdata) { if (argc >= 2) { /* If a username was specified, use it */ - if (valid_user_group_name(argv[1])) + if (valid_user_group_name(argv[1], 0)) r = json_variant_set_field_string(&arg_identity_extra, "userName", argv[1]); else { _cleanup_free_ char *un = NULL, *rr = NULL; @@ -3357,7 +3357,7 @@ static int parse_argv(int argc, char *argv[]) { if (r == 0) break; - if (!valid_user_group_name(word)) + if (!valid_user_group_name(word, 0)) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid group name %s.", word); mo = json_variant_ref(json_variant_by_key(arg_identity_extra, "memberOf")); diff --git a/src/home/homed-manager-bus.c b/src/home/homed-manager-bus.c index fce854527..34a7b4945 100644 --- a/src/home/homed-manager-bus.c +++ b/src/home/homed-manager-bus.c @@ -81,7 +81,7 @@ static int method_get_home_by_name( r = sd_bus_message_read(message, "s", &user_name); if (r < 0) return r; - if (!valid_user_group_name(user_name)) + if (!valid_user_group_name(user_name, 0)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name); h = hashmap_get(m->homes_by_name, user_name); @@ -212,7 +212,7 @@ static int method_get_user_record_by_name( r = sd_bus_message_read(message, "s", &user_name); if (r < 0) return r; - if (!valid_user_group_name(user_name)) + if (!valid_user_group_name(user_name, 0)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name); h = hashmap_get(m->homes_by_name, user_name); @@ -287,7 +287,7 @@ static int generic_home_method( if (r < 0) return r; - if (!valid_user_group_name(user_name)) + if (!valid_user_group_name(user_name, 0)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name); h = hashmap_get(m->homes_by_name, user_name); diff --git a/src/home/pam_systemd_home.c b/src/home/pam_systemd_home.c index 440ed85e2..9f34ee2ad 100644 --- a/src/home/pam_systemd_home.c +++ b/src/home/pam_systemd_home.c @@ -45,9 +45,12 @@ static int parse_argv( else if (please_suspend) *please_suspend = k; + } else if (streq(argv[i], "debug")) { + if (debug) + *debug = true; + } else if ((v = startswith(argv[i], "debug="))) { int k; - k = parse_boolean(v); if (k < 0) pam_syslog(handle, LOG_WARNING, "Failed to parse debug= argument, ignoring: %s", v); @@ -88,7 +91,7 @@ static int acquire_user_record( /* Let's bypass all IPC complexity for the two user names we know for sure we don't manage, and for * user names we don't consider valid. */ - if (STR_IN_SET(username, "root", NOBODY_USER_NAME) || !valid_user_group_name(username)) + if (STR_IN_SET(username, "root", NOBODY_USER_NAME) || !valid_user_group_name(username, 0)) return PAM_USER_UNKNOWN; /* Let's check if a previous run determined that this user is not managed by homed. If so, let's exit early */ diff --git a/src/journal-remote/journal-remote-main.c b/src/journal-remote/journal-remote-main.c index 88e42d3a9..551b84130 100644 --- a/src/journal-remote/journal-remote-main.c +++ b/src/journal-remote/journal-remote-main.c @@ -786,7 +786,7 @@ static int help(void) { " --listen-http=ADDR Listen for HTTP connections at ADDR\n" " --listen-https=ADDR Listen for HTTPS connections at ADDR\n" " -o --output=FILE|DIR Write output to FILE or DIR/external-*.journal\n" - " --compress[=BOOL] XZ-compress the output journal (default: yes)\n" + " --compress[=BOOL] Use compression in the output journal (default: yes)\n" " --seal[=BOOL] Use event sealing (default: no)\n" " --key=FILENAME SSL key in PEM format (default:\n" " \"" PRIV_KEY_FILE "\")\n" diff --git a/src/libsystemd/sd-hwdb/hwdb-util.c b/src/libsystemd/sd-hwdb/hwdb-util.c index d790e8fd0..5c7521695 100644 --- a/src/libsystemd/sd-hwdb/hwdb-util.c +++ b/src/libsystemd/sd-hwdb/hwdb-util.c @@ -488,7 +488,7 @@ static int import_file(struct trie *trie, const char *filename, uint16_t file_pr size_t len; char *pos; - r = read_line(f, LONG_LINE_MAX, &line); + r = read_line_full(f, LONG_LINE_MAX, READ_LINE_NOT_A_TTY, &line); if (r < 0) return r; if (r == 0) diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 15201f900..047f83532 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -3170,6 +3170,12 @@ static int method_set_wall_message( if (r < 0) return r; + /* Short-circuit the operation if the desired state is already in place, to + * avoid an unnecessary polkit permission check. */ + if (streq_ptr(m->wall_message, empty_to_null(wall_message)) && + m->enable_wall_messages == enable_wall_messages) + goto done; + r = bus_verify_polkit_async(message, CAP_SYS_ADMIN, "org.freedesktop.login1.set-wall-message", @@ -3189,6 +3195,7 @@ static int method_set_wall_message( m->enable_wall_messages = enable_wall_messages; + done: return sd_bus_reply_method_return(message, NULL); } diff --git a/src/network/netdev/fou-tunnel.c b/src/network/netdev/fou-tunnel.c index 3cc273c7f..bc0dc185d 100644 --- a/src/network/netdev/fou-tunnel.c +++ b/src/network/netdev/fou-tunnel.c @@ -149,7 +149,10 @@ int config_parse_ip_protocol( void *data, void *userdata) { - uint8_t *protocol = data; + uint8_t *ret = data; + unsigned protocol; + /* linux/fou.h defines the netlink field as one byte, so we need to reject protocols numbers that + * don't fit in one byte. */ int r; assert(filename); @@ -158,19 +161,26 @@ int config_parse_ip_protocol( assert(rvalue); assert(data); - assert_cc(IPPROTO_MAX-1 <= UINT8_MAX); - r = parse_ip_protocol(rvalue); - if (r < 0) { - r = safe_atou8(rvalue, protocol); + if (r >= 0) + protocol = r; + else { + r = safe_atou(rvalue, &protocol); if (r < 0) log_syntax(unit, LOG_ERR, filename, line, r, - "Failed to parse IP protocol '%s' for Foo over UDP tunnel, " + "Failed to parse IP protocol '%s' for FooOverUDP tunnel, " "ignoring assignment: %m", rvalue); return 0; } - *protocol = r; + if (protocol > UINT8_MAX) { + log_syntax(unit, LOG_ERR, filename, line, 0, + "IP protocol '%s' for FooOverUDP tunnel out of range, " + "ignoring assignment: %m", rvalue); + return 0; + } + + *ret = protocol; return 0; } @@ -203,7 +213,7 @@ int config_parse_fou_tunnel_address( r = in_addr_from_string_auto(rvalue, f, addr); if (r < 0) log_syntax(unit, LOG_ERR, filename, line, r, - "Foo over UDP tunnel '%s' address is invalid, ignoring assignment: %s", + "FooOverUDP tunnel '%s' address is invalid, ignoring assignment: %s", lvalue, rvalue); return 0; diff --git a/src/nss-systemd/nss-systemd.c b/src/nss-systemd/nss-systemd.c index 08fe100c0..6a38246f8 100644 --- a/src/nss-systemd/nss-systemd.c +++ b/src/nss-systemd/nss-systemd.c @@ -95,7 +95,7 @@ enum nss_status _nss_systemd_getpwnam_r( /* If the username is not valid, then we don't know it. Ideally libc would filter these for us * anyway. We don't generate EINVAL here, because it isn't really out business to complain about * invalid user names. */ - if (!valid_user_group_name(name)) + if (!valid_user_group_name(name, VALID_USER_RELAX)) return NSS_STATUS_NOTFOUND; /* Synthesize entries for the root and nobody users, in case they are missing in /etc/passwd */ @@ -192,7 +192,7 @@ enum nss_status _nss_systemd_getgrnam_r( assert(gr); assert(errnop); - if (!valid_user_group_name(name)) + if (!valid_user_group_name(name, VALID_USER_RELAX)) return NSS_STATUS_NOTFOUND; /* Synthesize records for root and nobody, in case they are missing from /etc/group */ @@ -559,7 +559,7 @@ enum nss_status _nss_systemd_initgroups_dyn( assert(groupsp); assert(errnop); - if (!valid_user_group_name(user_name)) + if (!valid_user_group_name(user_name, VALID_USER_RELAX)) return NSS_STATUS_NOTFOUND; /* Don't allow extending these two special users, the same as we won't resolve them via getpwnam() */ diff --git a/src/resolve/resolved-etc-hosts.c b/src/resolve/resolved-etc-hosts.c index e6bf20db5..c2839d425 100644 --- a/src/resolve/resolved-etc-hosts.c +++ b/src/resolve/resolved-etc-hosts.c @@ -37,6 +37,8 @@ void etc_hosts_free(EtcHosts *hosts) { void manager_etc_hosts_flush(Manager *m) { etc_hosts_free(&m->etc_hosts); m->etc_hosts_mtime = USEC_INFINITY; + m->etc_hosts_ino = 0; + m->etc_hosts_dev = 0; } static int parse_line(EtcHosts *hosts, unsigned nr, const char *line) { @@ -224,8 +226,9 @@ static int manager_etc_hosts_read(Manager *m) { return 0; } - /* Did the mtime change? If not, there's no point in re-reading the file. */ - if (timespec_load(&st.st_mtim) == m->etc_hosts_mtime) + /* Did the mtime or ino/dev change? If not, there's no point in re-reading the file. */ + if (timespec_load(&st.st_mtim) == m->etc_hosts_mtime && + st.st_ino == m->etc_hosts_ino && st.st_dev == m->etc_hosts_dev) return 0; } @@ -249,6 +252,8 @@ static int manager_etc_hosts_read(Manager *m) { return r; m->etc_hosts_mtime = timespec_load(&st.st_mtim); + m->etc_hosts_ino = st.st_ino; + m->etc_hosts_dev = st.st_dev; m->etc_hosts_last = ts; return 1; diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 4f7207772..df25907a4 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -591,6 +591,8 @@ int manager_new(Manager **ret) { .need_builtin_fallbacks = true, .etc_hosts_last = USEC_INFINITY, .etc_hosts_mtime = USEC_INFINITY, + .etc_hosts_ino = 0, + .etc_hosts_dev = 0, .read_etc_hosts = true, }; diff --git a/src/resolve/resolved-manager.h b/src/resolve/resolved-manager.h index 7f7d3a6b9..446f258b4 100644 --- a/src/resolve/resolved-manager.h +++ b/src/resolve/resolved-manager.h @@ -127,6 +127,8 @@ struct Manager { /* Data from /etc/hosts */ EtcHosts etc_hosts; usec_t etc_hosts_last, etc_hosts_mtime; + ino_t etc_hosts_ino; + dev_t etc_hosts_dev; bool read_etc_hosts; /* Local DNS stub on 127.0.0.53:53 */ diff --git a/src/resolve/resolved-resolv-conf.c b/src/resolve/resolved-resolv-conf.c index 7b487d50c..f5fc13563 100644 --- a/src/resolve/resolved-resolv-conf.c +++ b/src/resolve/resolved-resolv-conf.c @@ -283,9 +283,9 @@ static int write_uplink_resolv_conf_contents(FILE *f, OrderedSet *dns, OrderedSe "# This is a dynamic resolv.conf file for connecting local clients directly to\n" "# all known uplink DNS servers. This file lists all configured search domains.\n" "#\n" - "# Third party programs must not access this file directly, but only through the\n" - "# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,\n" - "# replace this symlink by a static file or a different symlink.\n" + "# Third party programs should typically not access this file directly, but only\n" + "# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a\n" + "# different way, replace this symlink by a static file or a different symlink.\n" "#\n" "# See man:systemd-resolved.service(8) for details about the supported modes of\n" "# operation for /etc/resolv.conf.\n" @@ -308,24 +308,24 @@ static int write_uplink_resolv_conf_contents(FILE *f, OrderedSet *dns, OrderedSe } static int write_stub_resolv_conf_contents(FILE *f, OrderedSet *dns, OrderedSet *domains) { - fputs_unlocked("# This file is managed by man:systemd-resolved(8). Do not edit.\n" - "#\n" - "# This is a dynamic resolv.conf file for connecting local clients to the\n" - "# internal DNS stub resolver of systemd-resolved. This file lists all\n" - "# configured search domains.\n" - "#\n" - "# Run \"resolvectl status\" to see details about the uplink DNS servers\n" - "# currently in use.\n" - "#\n" - "# Third party programs must not access this file directly, but only through the\n" - "# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,\n" - "# replace this symlink by a static file or a different symlink.\n" - "#\n" - "# See man:systemd-resolved.service(8) for details about the supported modes of\n" - "# operation for /etc/resolv.conf.\n" - "\n" - "nameserver 127.0.0.53\n" - "options edns0\n", f); + fputs("# This file is managed by man:systemd-resolved(8). Do not edit.\n" + "#\n" + "# This is a dynamic resolv.conf file for connecting local clients to the\n" + "# internal DNS stub resolver of systemd-resolved. This file lists all\n" + "# configured search domains.\n" + "#\n" + "# Run \"resolvectl status\" to see details about the uplink DNS servers\n" + "# currently in use.\n" + "#\n" + "# Third party programs should typically not access this file directly, but only\n" + "# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a\n" + "# different way, replace this symlink by a static file or a different symlink.\n" + "#\n" + "# See man:systemd-resolved.service(8) for details about the supported modes of\n" + "# operation for /etc/resolv.conf.\n" + "\n" + "nameserver 127.0.0.53\n" + "options edns0\n", f); if (!ordered_set_isempty(domains)) write_resolv_conf_search(domains, f); diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index 657df0a51..3ba33606f 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -294,7 +294,7 @@ int config_parse(const char *unit, _cleanup_fclose_ FILE *ours = NULL; unsigned line = 0, section_line = 0; bool section_ignored = false, bom_seen = false; - int r; + int r, fd; assert(filename); assert(lookup); @@ -311,7 +311,9 @@ int config_parse(const char *unit, } } - fd_warn_permissions(filename, fileno(f)); + fd = fileno(f); + if (fd >= 0) /* stream might not have an fd, let's be careful hence */ + fd_warn_permissions(filename, fd); for (;;) { _cleanup_free_ char *buf = NULL; diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 1ef69fdf4..34b6d44b4 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -1188,6 +1188,8 @@ static int decrypt_partition( if (r < 0) return log_debug_errno(r, "Failed to initialize dm-crypt: %m"); + crypt_set_log_callback(cd, cryptsetup_log_glue, NULL); + r = crypt_load(cd, CRYPT_LUKS, NULL); if (r < 0) return log_debug_errno(r, "Failed to load LUKS metadata: %m"); @@ -1246,6 +1248,8 @@ static int verity_partition( if (r < 0) return r; + crypt_set_log_callback(cd, cryptsetup_log_glue, NULL); + r = crypt_load(cd, CRYPT_VERITY, NULL); if (r < 0) return r; diff --git a/src/shared/group-record.c b/src/shared/group-record.c index d5ec32f07..3c9520693 100644 --- a/src/shared/group-record.c +++ b/src/shared/group-record.c @@ -86,8 +86,8 @@ static int dispatch_per_machine(const char *name, JsonVariant *variant, JsonDisp { "matchMachineId", _JSON_VARIANT_TYPE_INVALID, NULL, 0, 0 }, { "matchHostname", _JSON_VARIANT_TYPE_INVALID, NULL, 0, 0 }, { "gid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(GroupRecord, gid), 0 }, - { "members", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, members), 0 }, - { "administrators", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, administrators), 0 }, + { "members", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, members), JSON_RELAX}, + { "administrators", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, administrators), JSON_RELAX}, {}, }; @@ -190,14 +190,14 @@ int group_record_load( UserRecordLoadFlags load_flags) { static const JsonDispatch group_dispatch_table[] = { - { "groupName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(GroupRecord, group_name), 0 }, + { "groupName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(GroupRecord, group_name), JSON_RELAX}, { "realm", JSON_VARIANT_STRING, json_dispatch_realm, offsetof(GroupRecord, realm), 0 }, { "disposition", JSON_VARIANT_STRING, json_dispatch_user_disposition, offsetof(GroupRecord, disposition), 0 }, { "service", JSON_VARIANT_STRING, json_dispatch_string, offsetof(GroupRecord, service), JSON_SAFE }, { "lastChangeUSec", JSON_VARIANT_UNSIGNED, json_dispatch_uint64, offsetof(GroupRecord, last_change_usec), 0 }, { "gid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(GroupRecord, gid), 0 }, - { "members", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, members), 0 }, - { "administrators", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, administrators), 0 }, + { "members", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, members), JSON_RELAX}, + { "administrators", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(GroupRecord, administrators), JSON_RELAX}, { "privileged", JSON_VARIANT_OBJECT, dispatch_privileged, 0, 0 }, diff --git a/src/shared/json.c b/src/shared/json.c index e28a5df19..7a79acdee 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -4107,7 +4107,7 @@ int json_dispatch_user_group_name(const char *name, JsonVariant *variant, JsonDi return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name)); n = json_variant_string(variant); - if (!valid_user_group_name_compat(n)) + if (!valid_user_group_name(n, FLAGS_SET(flags, JSON_RELAX) ? VALID_USER_RELAX : 0)) return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a valid user/group name.", strna(name)); r = free_and_strdup(s, n); diff --git a/src/shared/json.h b/src/shared/json.h index b9b300a1d..a4e5b6f50 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -255,6 +255,7 @@ typedef enum JsonDispatchFlags { JSON_MANDATORY = 1 << 1, /* Should existence of this property be mandatory? */ JSON_LOG = 1 << 2, /* Should the parser log about errors? */ JSON_SAFE = 1 << 3, /* Don't accept "unsafe" strings in json_dispatch_string() + json_dispatch_string() */ + JSON_RELAX = 1 << 4, /* Use relaxed user name checking in json_dispatch_user_group_name */ /* The following two may be passed into log_json() in addition to the three above */ JSON_DEBUG = 1 << 4, /* Indicates that this log message is a debug message */ diff --git a/src/shared/sleep-config.c b/src/shared/sleep-config.c index e63ef0f26..6dbdff7b2 100644 --- a/src/shared/sleep-config.c +++ b/src/shared/sleep-config.c @@ -223,7 +223,7 @@ static int calculate_swap_file_offset(const SwapEntry *swap, uint64_t *ret_offse fd = open(swap->device, O_RDONLY|O_CLOEXEC|O_NOCTTY); if (fd < 0) - return log_error_errno(errno, "Failed to open %s: %m", swap->device); + return log_error_errno(errno, "Failed to open swap file %s to determine on-disk offset: %m", swap->device); if (fstat(fd, &sb) < 0) return log_error_errno(errno, "Failed to stat %s: %m", swap->device); diff --git a/src/shared/user-record.c b/src/shared/user-record.c index ff2cc4114..080c2a140 100644 --- a/src/shared/user-record.c +++ b/src/shared/user-record.c @@ -600,7 +600,7 @@ int json_dispatch_user_group_list(const char *name, JsonVariant *variant, JsonDi if (!json_variant_is_string(e)) return json_log(e, flags, SYNTHETIC_ERRNO(EINVAL), "JSON array element is not a string."); - if (!valid_user_group_name_compat(json_variant_string(e))) + if (!valid_user_group_name(json_variant_string(e), FLAGS_SET(flags, JSON_RELAX) ? VALID_USER_RELAX : 0)) return json_log(e, flags, SYNTHETIC_ERRNO(EINVAL), "JSON array element is not a valid user/group name: %s", json_variant_string(e)); r = strv_extend(&l, json_variant_string(e)); @@ -938,7 +938,7 @@ static int dispatch_per_machine(const char *name, JsonVariant *variant, JsonDisp { "imagePath", JSON_VARIANT_STRING, json_dispatch_path, offsetof(UserRecord, image_path), 0 }, { "uid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, uid), 0 }, { "gid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, gid), 0 }, - { "memberOf", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(UserRecord, member_of), 0 }, + { "memberOf", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(UserRecord, member_of), JSON_RELAX}, { "fileSystemType", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, file_system_type), JSON_SAFE }, { "partitionUuid", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(UserRecord, partition_uuid), 0 }, { "luksUuid", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(UserRecord, luks_uuid), 0 }, @@ -1231,7 +1231,7 @@ int user_group_record_mangle( int user_record_load(UserRecord *h, JsonVariant *v, UserRecordLoadFlags load_flags) { static const JsonDispatch user_dispatch_table[] = { - { "userName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(UserRecord, user_name), 0 }, + { "userName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(UserRecord, user_name), JSON_RELAX}, { "realm", JSON_VARIANT_STRING, json_dispatch_realm, offsetof(UserRecord, realm), 0 }, { "realName", JSON_VARIANT_STRING, json_dispatch_gecos, offsetof(UserRecord, real_name), 0 }, { "emailAddress", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, email_address), JSON_SAFE }, @@ -1270,7 +1270,7 @@ int user_record_load(UserRecord *h, JsonVariant *v, UserRecordLoadFlags load_fla { "homeDirectory", JSON_VARIANT_STRING, json_dispatch_home_directory, offsetof(UserRecord, home_directory), 0 }, { "uid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, uid), 0 }, { "gid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, gid), 0 }, - { "memberOf", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(UserRecord, member_of), 0 }, + { "memberOf", JSON_VARIANT_ARRAY, json_dispatch_user_group_list, offsetof(UserRecord, member_of), JSON_RELAX}, { "fileSystemType", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, file_system_type), JSON_SAFE }, { "partitionUuid", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(UserRecord, partition_uuid), 0 }, { "luksUuid", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(UserRecord, luks_uuid), 0 }, diff --git a/src/shared/userdb.c b/src/shared/userdb.c index 92f879676..0769a792c 100644 --- a/src/shared/userdb.c +++ b/src/shared/userdb.c @@ -587,7 +587,7 @@ int userdb_by_name(const char *name, UserDBFlags flags, UserRecord **ret) { _cleanup_(json_variant_unrefp) JsonVariant *query = NULL; int r; - if (!valid_user_group_name_compat(name)) + if (!valid_user_group_name(name, VALID_USER_RELAX)) return -EINVAL; r = json_build(&query, JSON_BUILD_OBJECT( @@ -795,7 +795,7 @@ int groupdb_by_name(const char *name, UserDBFlags flags, GroupRecord **ret) { _cleanup_(json_variant_unrefp) JsonVariant *query = NULL; int r; - if (!valid_user_group_name_compat(name)) + if (!valid_user_group_name(name, VALID_USER_RELAX)) return -EINVAL; r = json_build(&query, JSON_BUILD_OBJECT( @@ -982,7 +982,7 @@ int membershipdb_by_user(const char *name, UserDBFlags flags, UserDBIterator **r assert(ret); - if (!valid_user_group_name_compat(name)) + if (!valid_user_group_name(name, VALID_USER_RELAX)) return -EINVAL; r = json_build(&query, JSON_BUILD_OBJECT( @@ -1025,7 +1025,7 @@ int membershipdb_by_group(const char *name, UserDBFlags flags, UserDBIterator ** assert(ret); - if (!valid_user_group_name_compat(name)) + if (!valid_user_group_name(name, VALID_USER_RELAX)) return -EINVAL; r = json_build(&query, JSON_BUILD_OBJECT( diff --git a/src/systemd/sd-messages.h b/src/systemd/sd-messages.h index e8d26ab71..162b650e6 100644 --- a/src/systemd/sd-messages.h +++ b/src/systemd/sd-messages.h @@ -158,6 +158,9 @@ _SD_BEGIN_DECLARATIONS; #define SD_MESSAGE_DNSSEC_DOWNGRADE SD_ID128_MAKE(36,db,2d,fa,5a,90,45,e1,bd,4a,f5,f9,3e,1c,f0,57) #define SD_MESSAGE_DNSSEC_DOWNGRADE_STR SD_ID128_MAKE_STR(36,db,2d,fa,5a,90,45,e1,bd,4a,f5,f9,3e,1c,f0,57) +#define SD_MESSAGE_UNSAFE_USER_NAME SD_ID128_MAKE(b6,1f,da,c6,12,e9,4b,91,82,28,5b,99,88,43,06,1f) +#define SD_MESSAGE_UNSAFE_USER_NAME_STR SD_ID128_MAKE_STR(b6,1f,da,c6,12,e9,4b,91,82,28,5b,99,88,43,06,1f) + _SD_END_DECLARATIONS; #endif diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c index f7cc7e090..c3e5457fc 100644 --- a/src/sysusers/sysusers.c +++ b/src/sysusers/sysusers.c @@ -1445,7 +1445,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (r < 0) log_error_errno(r, "[%s:%u] Failed to replace specifiers: %s", fname, line, name); - if (!valid_user_group_name(resolved_name)) + if (!valid_user_group_name(resolved_name, 0)) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "[%s:%u] '%s' is not a valid user or group name.", fname, line, resolved_name); @@ -1548,7 +1548,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { "[%s:%u] Lines of type 'm' require a group name in the third field.", fname, line); - if (!valid_user_group_name(resolved_id)) + if (!valid_user_group_name(resolved_id, 0)) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "[%s:%u] '%s' is not a valid user or group name.", fname, line, resolved_id); @@ -1589,7 +1589,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { if (split_pair(resolved_id, ":", &uid, &gid) == 0) { r = parse_gid(gid, &i->gid); if (r < 0) { - if (valid_user_group_name(gid)) + if (valid_user_group_name(gid, 0)) i->group_name = TAKE_PTR(gid); else return log_error_errno(r, "Failed to parse GID: '%s': %m", id); diff --git a/src/test/meson.build b/src/test/meson.build index b79b197c1..a150ee106 100644 --- a/src/test/meson.build +++ b/src/test/meson.build @@ -1123,6 +1123,10 @@ tests += [ [], []], + [['src/analyze/test-verify.c', 'src/analyze/analyze-verify.c', 'src/analyze/analyze-verify.h'], + [libcore, libshared], + []], + [['src/login/test-inhibit.c'], [], [], diff --git a/src/test/test-strv.c b/src/test/test-strv.c index dd6233175..e48d419f5 100644 --- a/src/test/test-strv.c +++ b/src/test/test-strv.c @@ -307,6 +307,12 @@ static void test_strv_split(void) { l = strv_split_full(" 'one' \" two\t three \"' four five", NULL, SPLIT_QUOTES | SPLIT_RELAX); assert_se(l); assert_se(strv_equal(l, (char**) input_table_quoted)); + + strv_free_erase(l); + + l = strv_split_full("\\", NULL, SPLIT_QUOTES | SPLIT_RELAX); + assert_se(l); + assert_se(strv_equal(l, STRV_MAKE("\\"))); } static void test_strv_split_empty(void) { diff --git a/src/test/test-user-util.c b/src/test/test-user-util.c index 11c01e518..a0e149518 100644 --- a/src/test/test-user-util.c +++ b/src/test/test-user-util.c @@ -63,144 +63,163 @@ static void test_uid_ptr(void) { assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000); } -static void test_valid_user_group_name_compat(void) { +static void test_valid_user_group_name_relaxed(void) { log_info("/* %s */", __func__); - assert_se(!valid_user_group_name_compat(NULL)); - assert_se(!valid_user_group_name_compat("")); - assert_se(!valid_user_group_name_compat("1")); - assert_se(!valid_user_group_name_compat("65535")); - assert_se(!valid_user_group_name_compat("-1")); - assert_se(!valid_user_group_name_compat("-kkk")); - assert_se(!valid_user_group_name_compat("rööt")); - assert_se(!valid_user_group_name_compat(".")); - assert_se(!valid_user_group_name_compat(".eff")); - assert_se(!valid_user_group_name_compat("foo\nbar")); - assert_se(!valid_user_group_name_compat("0123456789012345678901234567890123456789")); - assert_se(!valid_user_group_name_or_id_compat("aaa:bbb")); - assert_se(!valid_user_group_name_compat(".")); - assert_se(!valid_user_group_name_compat(".1")); - assert_se(!valid_user_group_name_compat(".65535")); - assert_se(!valid_user_group_name_compat(".-1")); - assert_se(!valid_user_group_name_compat(".-kkk")); - assert_se(!valid_user_group_name_compat(".rööt")); - assert_se(!valid_user_group_name_or_id_compat(".aaa:bbb")); + assert_se(!valid_user_group_name(NULL, VALID_USER_RELAX)); + assert_se(!valid_user_group_name("", VALID_USER_RELAX)); + assert_se(!valid_user_group_name("1", VALID_USER_RELAX)); + assert_se(!valid_user_group_name("65535", VALID_USER_RELAX)); + assert_se(!valid_user_group_name("-1", VALID_USER_RELAX)); + assert_se(!valid_user_group_name("foo\nbar", VALID_USER_RELAX)); + assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_RELAX)); + assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_RELAX|VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name(".aaa:bbb", VALID_USER_RELAX|VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name(".", VALID_USER_RELAX)); + assert_se(!valid_user_group_name("..", VALID_USER_RELAX)); - assert_se(valid_user_group_name_compat("root")); - assert_se(valid_user_group_name_compat("lennart")); - assert_se(valid_user_group_name_compat("LENNART")); - assert_se(valid_user_group_name_compat("_kkk")); - assert_se(valid_user_group_name_compat("kkk-")); - assert_se(valid_user_group_name_compat("kk-k")); - assert_se(valid_user_group_name_compat("eff.eff")); - assert_se(valid_user_group_name_compat("eff.")); + assert_se(valid_user_group_name("root", VALID_USER_RELAX)); + assert_se(valid_user_group_name("lennart", VALID_USER_RELAX)); + assert_se(valid_user_group_name("LENNART", VALID_USER_RELAX)); + assert_se(valid_user_group_name("_kkk", VALID_USER_RELAX)); + assert_se(valid_user_group_name("kkk-", VALID_USER_RELAX)); + assert_se(valid_user_group_name("kk-k", VALID_USER_RELAX)); + assert_se(valid_user_group_name("eff.eff", VALID_USER_RELAX)); + assert_se(valid_user_group_name("eff.", VALID_USER_RELAX)); + assert_se(valid_user_group_name("-kkk", VALID_USER_RELAX)); + assert_se(valid_user_group_name("rööt", VALID_USER_RELAX)); + assert_se(valid_user_group_name(".eff", VALID_USER_RELAX)); + assert_se(valid_user_group_name(".1", VALID_USER_RELAX)); + assert_se(valid_user_group_name(".65535", VALID_USER_RELAX)); + assert_se(valid_user_group_name(".-1", VALID_USER_RELAX)); + assert_se(valid_user_group_name(".-kkk", VALID_USER_RELAX)); + assert_se(valid_user_group_name(".rööt", VALID_USER_RELAX)); + assert_se(valid_user_group_name("...", VALID_USER_RELAX)); - assert_se(valid_user_group_name_compat("some5")); - assert_se(valid_user_group_name_compat("5some")); - assert_se(valid_user_group_name_compat("INNER5NUMBER")); + assert_se(valid_user_group_name("some5", VALID_USER_RELAX)); + assert_se(valid_user_group_name("5some", VALID_USER_RELAX)); + assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_RELAX)); + + assert_se(valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_RELAX)); + assert_se(valid_user_group_name("Dāvis", VALID_USER_RELAX)); } static void test_valid_user_group_name(void) { log_info("/* %s */", __func__); - assert_se(!valid_user_group_name(NULL)); - assert_se(!valid_user_group_name("")); - assert_se(!valid_user_group_name("1")); - assert_se(!valid_user_group_name("65535")); - assert_se(!valid_user_group_name("-1")); - assert_se(!valid_user_group_name("-kkk")); - assert_se(!valid_user_group_name("rööt")); - assert_se(!valid_user_group_name(".")); - assert_se(!valid_user_group_name(".eff")); - assert_se(!valid_user_group_name("foo\nbar")); - assert_se(!valid_user_group_name("0123456789012345678901234567890123456789")); - assert_se(!valid_user_group_name_or_id("aaa:bbb")); - assert_se(!valid_user_group_name(".")); - assert_se(!valid_user_group_name(".1")); - assert_se(!valid_user_group_name(".65535")); - assert_se(!valid_user_group_name(".-1")); - assert_se(!valid_user_group_name(".-kkk")); - assert_se(!valid_user_group_name(".rööt")); - assert_se(!valid_user_group_name_or_id(".aaa:bbb")); + assert_se(!valid_user_group_name(NULL, 0)); + assert_se(!valid_user_group_name("", 0)); + assert_se(!valid_user_group_name("1", 0)); + assert_se(!valid_user_group_name("65535", 0)); + assert_se(!valid_user_group_name("-1", 0)); + assert_se(!valid_user_group_name("-kkk", 0)); + assert_se(!valid_user_group_name("rööt", 0)); + assert_se(!valid_user_group_name(".", 0)); + assert_se(!valid_user_group_name(".eff", 0)); + assert_se(!valid_user_group_name("foo\nbar", 0)); + assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", 0)); + assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name(".", 0)); + assert_se(!valid_user_group_name("..", 0)); + assert_se(!valid_user_group_name("...", 0)); + assert_se(!valid_user_group_name(".1", 0)); + assert_se(!valid_user_group_name(".65535", 0)); + assert_se(!valid_user_group_name(".-1", 0)); + assert_se(!valid_user_group_name(".-kkk", 0)); + assert_se(!valid_user_group_name(".rööt", 0)); + assert_se(!valid_user_group_name(".aaa:bbb", VALID_USER_ALLOW_NUMERIC)); - assert_se(valid_user_group_name("root")); - assert_se(valid_user_group_name("lennart")); - assert_se(valid_user_group_name("LENNART")); - assert_se(valid_user_group_name("_kkk")); - assert_se(valid_user_group_name("kkk-")); - assert_se(valid_user_group_name("kk-k")); - assert_se(!valid_user_group_name("eff.eff")); - assert_se(!valid_user_group_name("eff.")); + assert_se(valid_user_group_name("root", 0)); + assert_se(valid_user_group_name("lennart", 0)); + assert_se(valid_user_group_name("LENNART", 0)); + assert_se(valid_user_group_name("_kkk", 0)); + assert_se(valid_user_group_name("kkk-", 0)); + assert_se(valid_user_group_name("kk-k", 0)); + assert_se(!valid_user_group_name("eff.eff", 0)); + assert_se(!valid_user_group_name("eff.", 0)); - assert_se(valid_user_group_name("some5")); - assert_se(!valid_user_group_name("5some")); - assert_se(valid_user_group_name("INNER5NUMBER")); + assert_se(valid_user_group_name("some5", 0)); + assert_se(!valid_user_group_name("5some", 0)); + assert_se(valid_user_group_name("INNER5NUMBER", 0)); + + assert_se(!valid_user_group_name("piff.paff@ad.domain.example", 0)); + assert_se(!valid_user_group_name("Dāvis", 0)); } -static void test_valid_user_group_name_or_id_compat(void) { +static void test_valid_user_group_name_or_numeric_relaxed(void) { log_info("/* %s */", __func__); - assert_se(!valid_user_group_name_or_id_compat(NULL)); - assert_se(!valid_user_group_name_or_id_compat("")); - assert_se(valid_user_group_name_or_id_compat("0")); - assert_se(valid_user_group_name_or_id_compat("1")); - assert_se(valid_user_group_name_or_id_compat("65534")); - assert_se(!valid_user_group_name_or_id_compat("65535")); - assert_se(valid_user_group_name_or_id_compat("65536")); - assert_se(!valid_user_group_name_or_id_compat("-1")); - assert_se(!valid_user_group_name_or_id_compat("-kkk")); - assert_se(!valid_user_group_name_or_id_compat("rööt")); - assert_se(!valid_user_group_name_or_id_compat(".")); - assert_se(!valid_user_group_name_or_id_compat(".eff")); - assert_se(valid_user_group_name_or_id_compat("eff.eff")); - assert_se(valid_user_group_name_or_id_compat("eff.")); - assert_se(!valid_user_group_name_or_id_compat("foo\nbar")); - assert_se(!valid_user_group_name_or_id_compat("0123456789012345678901234567890123456789")); - assert_se(!valid_user_group_name_or_id_compat("aaa:bbb")); + assert_se(!valid_user_group_name(NULL, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(!valid_user_group_name("", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("0", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("1", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("65534", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(!valid_user_group_name("65535", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("65536", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(!valid_user_group_name("-1", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(!valid_user_group_name("foo\nbar", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(!valid_user_group_name(".", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(!valid_user_group_name("..", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); - assert_se(valid_user_group_name_or_id_compat("root")); - assert_se(valid_user_group_name_or_id_compat("lennart")); - assert_se(valid_user_group_name_or_id_compat("LENNART")); - assert_se(valid_user_group_name_or_id_compat("_kkk")); - assert_se(valid_user_group_name_or_id_compat("kkk-")); - assert_se(valid_user_group_name_or_id_compat("kk-k")); + assert_se(valid_user_group_name("root", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("lennart", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("LENNART", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("_kkk", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("kkk-", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("kk-k", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("-kkk", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("rööt", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name(".eff", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("eff.eff", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("eff.", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("...", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); - assert_se(valid_user_group_name_or_id_compat("some5")); - assert_se(valid_user_group_name_or_id_compat("5some")); - assert_se(valid_user_group_name_or_id_compat("INNER5NUMBER")); + assert_se(valid_user_group_name("some5", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("5some", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + + assert_se(valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); + assert_se(valid_user_group_name("Dāvis", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); } -static void test_valid_user_group_name_or_id(void) { +static void test_valid_user_group_name_or_numeric(void) { log_info("/* %s */", __func__); - assert_se(!valid_user_group_name_or_id(NULL)); - assert_se(!valid_user_group_name_or_id("")); - assert_se(valid_user_group_name_or_id("0")); - assert_se(valid_user_group_name_or_id("1")); - assert_se(valid_user_group_name_or_id("65534")); - assert_se(!valid_user_group_name_or_id("65535")); - assert_se(valid_user_group_name_or_id("65536")); - assert_se(!valid_user_group_name_or_id("-1")); - assert_se(!valid_user_group_name_or_id("-kkk")); - assert_se(!valid_user_group_name_or_id("rööt")); - assert_se(!valid_user_group_name_or_id(".")); - assert_se(!valid_user_group_name_or_id(".eff")); - assert_se(!valid_user_group_name_or_id("eff.eff")); - assert_se(!valid_user_group_name_or_id("eff.")); - assert_se(!valid_user_group_name_or_id("foo\nbar")); - assert_se(!valid_user_group_name_or_id("0123456789012345678901234567890123456789")); - assert_se(!valid_user_group_name_or_id("aaa:bbb")); + assert_se(!valid_user_group_name(NULL, VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("0", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("1", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("65534", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("65535", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("65536", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("-1", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("-kkk", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("rööt", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name(".", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("..", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("...", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name(".eff", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("eff.eff", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("eff.", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("foo\nbar", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC)); - assert_se(valid_user_group_name_or_id("root")); - assert_se(valid_user_group_name_or_id("lennart")); - assert_se(valid_user_group_name_or_id("LENNART")); - assert_se(valid_user_group_name_or_id("_kkk")); - assert_se(valid_user_group_name_or_id("kkk-")); - assert_se(valid_user_group_name_or_id("kk-k")); + assert_se(valid_user_group_name("root", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("lennart", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("LENNART", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("_kkk", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("kkk-", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("kk-k", VALID_USER_ALLOW_NUMERIC)); - assert_se(valid_user_group_name_or_id("some5")); - assert_se(!valid_user_group_name_or_id("5some")); - assert_se(valid_user_group_name_or_id("INNER5NUMBER")); + assert_se(valid_user_group_name("some5", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("5some", VALID_USER_ALLOW_NUMERIC)); + assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_ALLOW_NUMERIC)); + + assert_se(!valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_ALLOW_NUMERIC)); + assert_se(!valid_user_group_name("Dāvis", VALID_USER_ALLOW_NUMERIC)); } static void test_valid_gecos(void) { @@ -355,10 +374,10 @@ int main(int argc, char *argv[]) { test_parse_uid(); test_uid_ptr(); - test_valid_user_group_name_compat(); + test_valid_user_group_name_relaxed(); test_valid_user_group_name(); - test_valid_user_group_name_or_id_compat(); - test_valid_user_group_name_or_id(); + test_valid_user_group_name_or_numeric_relaxed(); + test_valid_user_group_name_or_numeric(); test_valid_gecos(); test_valid_home(); diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 0332e9926..cb564a7c5 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -490,7 +490,7 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, if (config->alternative_names_policy) for (NamePolicy *p = config->alternative_names_policy; *p != _NAMEPOLICY_INVALID; p++) { - const char *n; + const char *n = NULL; switch (*p) { case NAMEPOLICY_DATABASE: diff --git a/src/userdb/userdbctl.c b/src/userdb/userdbctl.c index b3ddd9d14..793ef6b07 100644 --- a/src/userdb/userdbctl.c +++ b/src/userdb/userdbctl.c @@ -541,16 +541,15 @@ static int ssh_authorized_keys(int argc, char *argv[], void *userdata) { _cleanup_(user_record_unrefp) UserRecord *ur = NULL; int r; - if (!valid_user_group_name(argv[1])) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid user name '%s'.", argv[1]); - r = userdb_by_name(argv[1], arg_userdb_flags, &ur); if (r == -ESRCH) - log_error_errno(r, "User %s does not exist.", argv[1]); + return log_error_errno(r, "User %s does not exist.", argv[1]); else if (r == -EHOSTDOWN) - log_error_errno(r, "Selected user database service is not available for this request."); + return log_error_errno(r, "Selected user database service is not available for this request."); + else if (r == -EINVAL) + return log_error_errno(r, "Failed to find user %s: %m (Invalid user name?)", argv[1]); else if (r < 0) - log_error_errno(r, "Failed to find user %s: %m", argv[1]); + return log_error_errno(r, "Failed to find user %s: %m", argv[1]); if (strv_isempty(ur->ssh_authorized_keys)) log_debug("User record for %s has no public SSH keys.", argv[1]); diff --git a/test/TEST-47-ISSUE-14566/testsuite.sh b/test/TEST-47-ISSUE-14566/testsuite.sh index a0ba32530..df8d0e960 100755 --- a/test/TEST-47-ISSUE-14566/testsuite.sh +++ b/test/TEST-47-ISSUE-14566/testsuite.sh @@ -12,6 +12,7 @@ systemctl status issue_14566_test leaked_pid=$(cat /leakedtestpid) systemctl stop issue_14566_test +sleep 1 # Leaked PID will still be around if we're buggy. # I personally prefer to see 42.